【问题标题】:why the result is nan in this c float conversion?为什么这个 c 浮点转换的结果是 nan?
【发布时间】:2014-12-21 09:00:25
【问题描述】:

float 和 int 类型都是 4 个字节,我尝试用这种方式转换:

unsigned int x = 0; // 00000000
x = ~x>>1; // 7fffffff
float f = *((float *)&x);
printf("%f\n", f);

因为c浮点数的第一位代表+/-,接下来的8位是2^(exp-127)中的exp,其余的将转换为0.xxxxx...,这意味着我可以获得最大浮点数:@987654326 @ 但最后我得到了nan

那么有什么问题吗?

【问题讨论】:

  • 您正在对平台上浮动的表示进行假设。不管怎样,你为什么要这样做——你以后写这种代码会遇到很多问题
  • @EdHeal 我想他想学习浮点格式。
  • @ikh - 这取决于平台
  • @ikh 是的~所以这让我很困惑
  • 2 点 1. 浮点值与整数值的存储方式有何不同,因此使用指向 int 的浮点指针并不好。 2.你有一个错误的格式说明符来打印浮点值,这将导致 UB

标签: c types


【解决方案1】:

您很接近,但您的指数超出范围,因此您有一个NaNFLT_MAX 是:

0 11111110 11111111111111111111111
s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm

请注意,最大指数是11111110,因为11111111 是为NaNs 保留的。

对应的十六进制值为:

0x7f7fffff

所以你的代码应该是:

unsigned int x = 0x7f7fffff;
float f = *((float *)&x);
printf("%f\n", f);

结果将是:

3.4028235E38

如果您对 IEEE-754 格式感兴趣,请查看这个方便的在线计算器,它可以在二进制、十六进制和浮点格式之间进行转换:http://www.h-schmidt.net/FloatConverter/IEEE754.html

【讨论】:

  • 因为11111111 是为NaNs 保留的。
【解决方案2】:

按位 IEEE 浮点标准单精度(32 位)NaN(非数字)将是:

s111 1111 1xxx xxxx xxxx xxxx xxxx xxxx

其中 s 是符号(在应用程序中最常被忽略),x 非零(零值表示无穷大)。

【讨论】:

    【解决方案3】:

    为了得到最大float值的二进制表示,执行“逆”:

    float f = FLT_MAX;
    int x = *((int*)&f);
    printf("0x%.8X\n",x);
    

    结果是0x7F7FFFFF(而不是您假设的0x7FFFFFFF)。

    C 语言标准没有规定sizeof(float) == sizeof(int)

    因此,您必须在您的平台上对此进行验证,以确保正确执行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-20
      • 1970-01-01
      • 2014-03-21
      • 1970-01-01
      • 2023-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多