gpt4 book ai didi

c - 意外的浮点比较

转载 作者:行者123 更新时间:2023-11-30 14:24:37 25 4
gpt4 key购买 nike

考虑以下代码:

#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;
}

将此视为 this 的第二部分问题,这里的理解是,浮点常量的 double 值(表示为数字常量时为 double )在转换为相应的浮点值时会丢失。异常(exception)值为 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精度值??我们如何解释这种行为?

最佳答案

Can't we assume that float precision values are always less than double precision values??

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

但是,出于所有实际目的,double 是一个有利可图的赌注。具有 53 位精度和 float有 24 个。然后 double有 11 位指数,float 8 位。

因此,忽略异国情调的架构,floatdouble 相比,精度较低且范围较小,每 float值表示为 double ,但反之则不然。因此从 float 进行类型转换至double是保值的,但是从 double 进行转换至float将更改所有需要超过 24 位精度的值。

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

  • 如果尾数的第 25 个最高有效位为 0,则尾数将被截断(值向零舍入)
  • 如果第 25 个最高有效位为 1,且并非所有较低有效位均为 0,则该值将从零舍入(尾数被截断,然后是最低有效位的值)添加位)
  • 否则,尾数将被舍入,因此第 24 个最高有效位为零,即一半情况下从零舍入,一半情况向零舍入。

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

关于c - 意外的浮点比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11541133/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com