黒体輻射のプランク数式を計算、絶対温度 T = 3K にして周波数を1000THzまでにして計算したら途中で Overflow が出た。
wxMaxima, Pythonで。
じゃあ、倍の倍にすればいいんじゃない・・・って。g++には80bitのがあるって知って、それはね、 long double と書く。
なので、doubleをlong doubleにして計算したらOverflow出なかった。g++の場合。
同じプログラムをVisualStudio 2019 Communityでやってみた。すると、long doubleと書いて実行しとるのに、inf が出ましたわな。
これはなんで? そこは数字が出て、10の500乗でも計算範囲のハズだが。
というわけで、Microsoft VC++ の浮動小数点ってどないなってんのか?
https://docs.microsoft.com/ja-jp/cpp/c-runtime-library/floating-point-support?view=vs-2019
以前の 16 ビット バージョンの Microsoft C/C++ および Microsoft Visual C++ では、80 ビット精度浮動小数点データ型として long double 型をサポートしていました。 最近のバージョンの Visual C++ では、long double データ型は、double 型と同じ 64 ビット精度浮動小数点データ型となっています。 コンパイラは long double と double を個別の型として扱いますが、long double 関数はそれに対応する double 関数と同じです。 CRT では、ISO C99 ソース コードの互換性を維持するために long double バージョンの数値演算関数を提供しています。ただし、そのバイナリ表現は他のコンパイラと異なる場合があるので注意してください。
------------------------------------
これだと、long doubleと書いてもdoubleとして処理されるってことではないか。
じゃあ、VC++で 10^308 を超える数値を扱う時はどうしたらいいの?
のおぉーしたたらいいのおぉーーー、 のうしたら・・・(伊藤蘭と志村のコント参照)
https://docs.microsoft.com/ja-jp/cpp/c-language/type-long-double?view=vs-2019
まあそういう事です。こうなるとC++コンパイラーは2種類は使えるようにしないといけないなー、趣味のレベルでも。テキトー
こういうの、処理系依存って言うのかね。知るかよ プンプン。