c - 在c中表示 float

标签 c ieee-754

<分区>

我读到 float 是按照 IEEE 754 表示法存储的,如果无法表示该数字,有时会显示近似值。

我编写了以下代码,其中我提取小数部分,然后在循环内将其乘以 10 九次。在循环结束时,值为 142000000.000000(变量 g)。 我在循环外再次将它乘以 10,结果为 1419999999.999999。

我将在 for 循环内显式计算的值存储在另一个变量 (k) 中,并将其乘以 10,得到的结果为 1420000000.000000

你能告诉我为什么它能够在第二个实例(在变量 k 中)中正确存储值的不同之处吗。

#include<stdio.h>
#include<math.h>
int main()
{
    double f=3.142,g,i;
    int j;
    g=modf(f,&i);

    printf("Inside loop");
    for(j=1;j<=9;j++)
    {
        g = g * 10.0;
        printf("\n%lf",g);
    }
    printf("\nLoop ends");

    g = g * 10.0;
    printf("\nThe value of g is %lf",g);

    double k = 142000000.000000;
    k = k * 10.0;
    printf("\nThe value of k is %lf",k);
}

输出

内部循环

1.420000

14.200000

142.000000

1420.000000

14200.000000

142000.000000

1420000.000000

14200000.000000

142000000.000000

循环结束

g的值为1419999999.999999

k的值为1420000000.000000

最佳答案

f 的初始值为3.142。该值无法准确表示,因此对该值的任何操作也将导致不准确的值。这就是您最终打印出不准确值的原因。

相比之下,k 的初始值为 142000000.000000可以完全表示为 double。将这个值乘以 10 仍然得到一个可以精确表示的值。

关于c - 在c中表示 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42770336/

相关文章:

c - 删除 C 中的多字符常量

c++ - 如何使用 fprintf/printf 打印破折号或点?

python - Matlab 的交换误差

c - 识别编译器产生的汇编程序中的某些组件

c - RC522默认键

c - 将输出从 C 程序导出到 Microsoft Excel?

javascript - 无法通过计算得到0.30000000000000004

floating-point - 没有下溢和溢出,是否有任何2个数字,其中A < B为十进制形式,但转换为 float 后A> B?

阶乘的精度运算和溢出