0

考虑以下代码:

#include<stdio.h>
#define k 0.7
#define p 0.5
int main()
{
    float a=k,b=p;
    double aa=k;
    if(a<k)
    {
         if(b<p) printf("2 is right");    
         else      printf("1 is right");
    }
    else printf("0 is right");
    printf("\n");
    if(a>k)
    {
         if(b<p) printf("2 is right");    
         else      printf("1 is right");
    }
    else printf("0 is right");
    return 0;
}

将此视为问题的第二部分,这里的理解是浮点常量的双精度值(表示为数字常量时的双精度值)在转换为相应的浮点值时丢失。异常值为 X.5 和 X.0。但我观察到以下结果:

Input           Output
K=0.1 to 0.4        0 is right
                    1 is right

K=0.5               0 is right
                    1 is right

K=0.6               0 is right
                    1 is right

K=0.7               1 is right
                    0 is right

K=0.8               0 is right
                    1 is right

K=0.9               1 is right
                    0 is right

K=8.4               1 is right
                    0 is right

为什么会有这种奇怪的行为?为什么只有少数浮点值显示此属性?我们不能假设float精度值总是小于精度double值吗?我们如何解释这种行为?

4

1 回答 1

2

我们不能假设float精度值总是小于double精度值吗?

并非如此,它们可能都具有相同的精度。您可以假设 的范围和精度double不小于 的float

但是,出于所有实际目的,这是一个有利可图的赌注,它double有 53 位精度和float24 位精度。它double有 11 位指数,float8 位。

因此,不考虑外来架构,float其精度和范围都小于double,每个float值都可以表示为double,但反之则不然。所以从floatto 转换double是保值的,但是从doubleto 转换float会改变所有需要超过 24 位精度的值。

通常float通过将值的有效位按以下方式四舍五入double为 24 位精度来执行转换(对于范围内的值):

  • 如果有效数字的第 25最高有效位为 0,则有效数字被截断(该值向零四舍五入)
  • 如果第 25最高有效位为 1,并且并非所有较低有效位都为 0,则从零开始舍入该值(截断有效位,然后添加最低有效位的值)
  • 否则,有效位被四舍五入,因此第 24最高有效位为零,在一半的情况下从零四舍五入,在一半的情况下向零四舍五入。

您无法通过查看小数扩展来预测将 a 转换为doublefloat增加还是减少该值,除非在少数情况下您可以看到该值将保持不变。重要的是二进制扩展。

于 2012-07-18T12:43:12.553 回答