【问题标题】:C++ printing float as nanC++ 打印浮点数为 nan
【发布时间】:2020-11-11 02:30:23
【问题描述】:

这是一个简化的 C++ 程序,将 4 个字节转换为其 IEE754 浮点表示。

#include <iostream>
#include <math.h>
#include <memory.h>

uint8_t bytes[4] = {0x40, 0xd5, 0xc6, 0x7f}; // 0x40d5c67f
float f;

int main()
{
    memcpy(&f, &bytes[0], 4);
    printf("%.*lf", 5, f);
}

它的输出是nanisnan 也为它返回 true。这是怎么发生的? 0x40d5c67f is 6.6804...

发生在我的类似 arduino 的微控制器和 http://cpp.sh/

【问题讨论】:

  • 你的机器是什么?
  • @MikeCAT 好点,在类似 arduino 的微控制器和 cpp.sh 上进行了测试。已添加到问题中。
  • 也欢迎将 4 个字节转换为浮点数的更好方法 :)
  • 如果你使用uint32_t bytes = UINT32_C(0x40d5c67f);memcpy(&amp;f, &amp;bytes, 4);怎么办?
  • @MikeCAT 是的,解决了它!我很想知道为什么

标签: c++ floating-point nan


【解决方案1】:

如果您在使用 little-endian 的机器上运行此代码, 多字节数字的高位存储在内存的高位地址中。

因此,在小端机器上,内存中的 4 字节数字 0x40, 0xd5, 0xc6, 0x7f 被视为0x7fc6d540,而不是0x40d5c67f

解释为 IEEE754,这个数字的指数部分是 255 和 这个数的小数部分不是0,所以这是NaN。

【讨论】:

    猜你喜欢
    • 2018-05-29
    • 2012-03-09
    • 2011-07-23
    • 2013-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-05
    • 1970-01-01
    相关资源
    最近更新 更多