このコードで正しい結果が得られない理由を突き止めようと頭を悩ませています。浮動小数点の正および負のオーバーフロー/アンダーフロー レベルの 16 進数表現を探しています。コードは、このサイトとウィキペディアのエントリに基づいています。
7f7f ffff ≈ 3.4028234 × 10 38 (最大単精度) -- ウィキペディアのエントリから、正のオーバーフローに対応
コードは次のとおりです。
#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;
}
出力は次のとおりです。
値がより大きい場合に正のオーバーフローが発生:
f3800000
値がより小さい場合に負のオーバーフローが発生7f800000
: 値がより大きい場合に正のアンダーフローが発生: 値がより大きい場合1
に負のオーバーフローが発生:80000001
浮動小数点の 16 進数表現を取得するために、ここで説明する方法を使用しています。
コードが機能しないのはなぜですか? 正のオーバーフロー = の場合に機能することはわかっています7f7f ffff
。