C++ 将浮点数打印为 nan
C++ printing float as nan
这是一个简化的 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);
}
它的输出是nan
! isnan
也 returns 对吧。这是怎么发生的? 0x40d5c67f is 6.6804...
发生在我的类似 arduino 的微控制器和 http://cpp.sh/
如果您 运行 在使用 little-endian 的机器上使用此代码,
多字节数的高位存储在内存的高地址。
因此,在小端机器上,内存中的 4 字节数字
0x40, 0xd5, 0xc6, 0x7f
被视为 0x7fc6d540
,而不是 0x40d5c67f
。
解释为 IEEE754,这个数字的指数部分是 255 并且
这个数字的小数部分不是 0,所以这是 NaN。
这是一个简化的 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);
}
它的输出是nan
! isnan
也 returns 对吧。这是怎么发生的? 0x40d5c67f is 6.6804...
发生在我的类似 arduino 的微控制器和 http://cpp.sh/
如果您 运行 在使用 little-endian 的机器上使用此代码, 多字节数的高位存储在内存的高地址。
因此,在小端机器上,内存中的 4 字节数字
0x40, 0xd5, 0xc6, 0x7f
被视为 0x7fc6d540
,而不是 0x40d5c67f
。
解释为 IEEE754,这个数字的指数部分是 255 并且 这个数字的小数部分不是 0,所以这是 NaN。