我绞尽脑汁想弄清楚为什么这段代码没有得到正确的结果。我正在寻找浮点正负上溢/下溢级别的十六进制表示。该代码基于此站点和 Wikipedia entry :
7f7f ffff ≈ 3.4028234 × 1038 (最大单精度)——来自维基百科条目,对应正溢出
这是代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
using namespace std;
int main(void) {
float two = 2;
float twentyThree = 23;
float one27 = 127;
float one49 = 149;
float posOverflow, negOverflow, posUnderflow, negUnderflow;
posOverflow = two - (pow(two, -twentyThree) * pow(two, one27));
negOverflow = -(two - (pow(two, one27) * pow(two, one27)));
negUnderflow = -pow(two, -one49);
posUnderflow = pow(two, -one49);
cout << "Positive overflow occurs when value greater than: " << hex << *(int*)&posOverflow << endl;
cout << "Neg overflow occurs when value less than: " << hex << *(int*)&negOverflow << endl;
cout << "Positive underflow occurs when value greater than: " << hex << *(int*)&posUnderflow << endl;
cout << "Neg overflow occurs when value greater than: " << hex << *(int*)&negUnderflow << endl;
}
输出是:
为了获得浮点的十六进制表示,我使用了 here 描述的方法:
为什么代码不起作用?我知道如果正溢出 =
7f7f ffff
它将起作用。 最佳答案
您对最高可表示正浮点数的表达是错误的。您链接的页面使用 (2-pow(2, -23)) * pow(2, 127)
,而您拥有 2 - (pow(2, -23) * pow(2, 127))
。对于最小的可表示负浮点数也是如此。
但是,您的下溢表达式看起来是正确的,它们的十六进制输出也是如此。
请注意, posOverflow
和 negOverflow
只是 +FLT_MAX
和 -FLT_MAX
。但请注意,您的 posUnderflow
和 negUnderflow
实际上比 FLT_MIN
小(因为它们是非正规的,而 FLT_MIN
是最小的正正规浮点数)。
关于c++ - 浮点限制代码不能产生正确的结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14928764/