Har*_*oni 3 c++ infinite ieee-754
正如cppreference所说:“在 IEEE 754(浮点数最常见的二进制表示形式)中,正无穷大是指数所有位均已设置且分数的所有位均已清除的值。”。我尝试了此代码片段,但没有看到指数位设置。我有什么地方说错了吗?
#include <iostream>
#include <limits>
#include <bitset>
#include <math.h>
using namespace std;
int main() {
float a = 0b00000000000000000000000000000000;
double b = std::numeric_limits<double>::infinity();
bitset<64> x(b);
cout<<x<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它在控制台上打印 0000000000000000000000000000000000000000000000000000000000000000 。
std::bitset没有接受double. 当您传递 时double,您而是调用接受的构造函数unsigned long long,并且double首先将 隐式转换为unsigned long long.
问题是,unsigned long long不能表示无穷大,因此程序的行为是不确定的。标准说:
[转换fpint]
浮点类型的纯右值可以转换为整数类型的纯右值。转换截断;也就是说,小数部分被丢弃。 如果截断值无法在目标类型中表示,则行为未定义。
要查看这些位,您可以首先将浮点“位转换”为整数类型,然后将该整数传递给 bitset:
auto int_b = std::bit_cast<std::uint64_t>(b);
std::bitset<64> x(int_b);
Run Code Online (Sandbox Code Playgroud)