Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C编程中浮点数的意外行为_C_Floating Point_Precision - Fatal编程技术网

C编程中浮点数的意外行为

C编程中浮点数的意外行为,c,floating-point,precision,C,Floating Point,Precision,我对c编程中的浮点数感到困惑 为什么它会产生这样的价值?老实说,你能告诉我它在C编程中是如何工作的吗 简而言之,没有255.167715这样的单精度浮点数。这是真实的任何计算机使用;这种情况并非C独有。作为单精度浮点数,最接近的值为255.167709 单精度浮点给您的精度相当于7位左右的十进制数字。正如你所看到的,你的输入和你得到的输出有七个位置,即255.1677。基本上没有意义的任何数字 有关浮点数学有时令人惊讶的方面的更多信息,请参见。在二进制中,255.167715约为11111111

我对c编程中的浮点数感到困惑


为什么它会产生这样的价值?老实说,你能告诉我它在C编程中是如何工作的吗

简而言之,没有255.167715这样的单精度浮点数。这是真实的任何计算机使用;这种情况并非C独有。作为单精度浮点数,最接近的值为255.167709

单精度浮点给您的精度相当于7位左右的十进制数字。正如你所看到的,你的输入和你得到的输出有七个位置,即255.1677。基本上没有意义的任何数字


有关浮点数学有时令人惊讶的方面的更多信息,请参见。

在二进制中,255.167715约为11111111。00101010111011101111101110010000001011010…2。在您的C实现中,源代码255.167715很可能被转换为11111111.001010101110111011110000000001100011102,即255.1677149999998695784597657620906829833984375,因为255.167715是一个双常量,这是实现的double类型中可表示的最接近十进制数255.167715的值,因为double类型只有53位有效位。有效位是浮点数的小数部分。还有一个符号和一个指数部分

然后,对于浮点a=255.167715;,此双精度值转换为浮点值。由于浮点类型只有24位有效位,因此结果为11111111.00101010111011112,十进制为255.1677093505859375


当您使用默认格式%f打印此文件时,将使用小数点后的六位数字,因此它将打印“255.167709”。

欢迎使用经常混淆的C编程语言。相关:浮点和双精度具有有限精度,如果指定的值无法准确存储,则使用足够接近的值。这个问题适用于所有计算机,甚至纸张计算。纸张是有限的,但通过选择适当的数据类型,可以减少对现实生活的影响,分别是更大的纸张。在浮点中存储数字时,您得到24位,即log102^24=7.2247位。但您的号码需要log10255167715=8.4068257246位。因此,最后的1.1821位数不能再存储了。另请参见断言255.167715不能用任何IEEE-754浮点格式表示是不正确的。作为链接到州的页面,IEEE-754包含十进制浮点格式。此外,255.167709不是最接近255.167715的数字,它可以用IEEE-754二进制格式表示,因为它不能用二进制格式表示。这正是我想要的!谢谢dudefloat b=19491.1234355 printf%f,b//output 19491.123047`但是你说应该是19491.123046875所以是19491.123046!我的代码有什么问题?@Md.A.Barik:%f格式规范在小数点后使用了六位数字。要打印更多内容,您可以在计算中使用%.99f或%.99g.@Epic产后输出:19491.123046,但在运行程序时显示:19491.123047。你能告诉我它是如何工作的吗?@Md.A.Barik:格式化时,值是四舍五入的。由于19491.123047比19491.123046更接近19491.123046875,因此使用它。注:C标准只要求正确的四舍五入到小数位数。之后,它允许一些灵活性。
#include <stdio.h>

int main()
{
    float a = 255.167715;
    printf("%f", a);
    return 0;
} // it print value of 255.167709