如何在 C++ 中以浮点/双精度值表示无穷大?

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 。

eer*_*ika 5

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)