私はmodf
の過負荷の解決のための質問があります。modfのオーバーロードの解決
次のコードを検討してください。私のテスト環境で
#include <iostream>
#include <iomanip>
#include <climits>
#include <cmath>
int main()
{
unsigned long ul = ULONG_MAX;
long double ipart;
long double fpart = std::modf(ul, &ipart);
std::cout << std::fixed << std::setprecision(0)
<< ul << ", " << ipart << ", " << fpart << '\n'
<< static_cast<double>(ul) << '\n';
}
、コード出力...
18446744073709551615, 18446744073709551615, 0
18446744073709551616
参照
任意演算の引数が対応する場合:http://melpon.org/wandbox/permlink/7ZF2CwqEwBRU5hg4
C++ 14標準26.8 [c.math] P.11は
はまた、確実にするのに十分な追加の過負荷が存在しなければならない、と言います
double
パラメータがタイプlong double
である場合、double
パラメータに対応するすべての算術引数は、long double
に効果的にキャストされます。そうでない場合、
double
パラメータに対応する任意の演算の引数がdouble
または整数型の型を持つ、次いでdouble
パラメータに対応するすべての算術 引数が有効double
にキャストされた場合。それ以外の場合、
double
パラメータに対応する算術引数はすべてfloat
です。
変数ul
long double
が、整数型を持っていないので、私は、その後、
ipart
は
18446744073709551616
でなければなりません
ul
が
double
にキャストされるべきだと思います。 (つまり、GCCの動作が間違っています)
この現象について誤解がありますか? (もちろん、GCCの動作がより好ましいと思います)
'std :: modf'の' long double'バリアントを呼び出していますが、静的キャストは 'double'でのみ行われます。 "ulは二重にキャストされるべきだと思う":あなたは間違っている、 'ul'は' long double'にキャストされる –