c - C 中的 float

标签 c floating-accuracy floating-point-precision

今天我在玩C中的 float
喜欢的代码:

float a = 0.0;
a += 0.8;
if(a == 0.800000)
   printf("correct");

if 语句没有被执行,为此我打印了 a 的值为 0.800000。

无效主函数(){

    float a=0.0f;

    a=a+0.1f;


    if(a==0.1f) 
    printf( "1correct");

    a += 0.1f;

    if(a==0.2f) 
    printf( "2correct");

    a += 0.1f;

    if(a==0.3f) 
    printf( "3correct");

    a += 0.1f;

    if(a==0.4f) 
    printf( "4correct");

    if(a==0.5f) 
    printf( "5correct");

    a += 0.1f;

    if(a==0.6f) 
    printf( "6correct");


    a += 0.1f;

    if(a==0.7f) 
    printf( "7correct");


    a += 0.1f;


    if(a==0.8f) 
    printf( "8correct");

} 

以下程序将输出打印为:

1correct2correct3correct4correct5correct6correct

语句 7 Correct 和 8 Correct 没有被打印出来。

任何人都可以在这里解释一下简介!!

最佳答案

有许多十进制数字无法用有限数量的二进制数字精确表示。

一般来说,测试 float 或 double 是否完全相等并不是一个好主意。如果您确实想测试它们,请检查它们是否在一个小范围内:

if ( a > 0.799999 && a < 0.800001 )
    printf( "correct" );

只要您可以使用整数而不是 float 或 double ,就这样做。例如,不要使用 float 作为循环计数器或数组索引。

浮点有很多很好的用途,例如对物理现象建模、预测天气等,但浮点有很多微妙之处。

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

相关文章:

c++ - GMP 的精度损失

c# - float 计算精度 : division vs multiplication

c# - 浮点运算以及x86和x64上下文

math - float 学有问题吗?

c++ - 将调试部分留在源代码中是一种好习惯吗?

c - 什么时候必须使用 malloc 分配内存?

java - 当你需要使用 float 时如何真正避免浮点错误?

c - Printf 宽度说明符用于保持浮点值的精度

c - 纯c中的内联函数和数据隐藏

c - 在不使用数组的情况下从标准输入中查找第二大元素