为什么(c++)从 long long unsigned int 转换为 long double 并返回产生 0
Why (c++) casting from long long unsigned int to long double and back produces 0
我有这样的程序:
#include "stdafx.h"
#include <iostream>
using namespace System;
using namespace std;
typedef long long unsigned int T_num;
typedef long double T_ld;
int main(array<System::String ^> ^args) {
T_num a = numeric_limits<T_num>::max();
T_ld b = numeric_limits<T_ld>::max();
if ( b > a ) {
cout << "decimal is bigger than integer" << endl;
} else {
cout << "integer is bigger than decimal" << endl;
}
T_num c;
b = a;
c = floor(b);
if ( c == a) {
cout << "OK" << endl;
} else {
cout << "dupa" << endl;
cout << c << endl;
cout << a << endl;
cout << b << endl;
}
system("pause");
return 0;
}
产生这样的输出:
decimal is bigger than integer
dupa
0
18446744073709551615
1.84467e+019
Press any key to continue . . .
如果b可以包含a,那为什么c是0?
嗯...它(网页)要求我提供更多详细信息,但我不确定我还能说什么...
我希望如果 a 适合 b 那么它应该能够将它从 b 转换回 c。
b
不一定包含a
,只是它的一个近似值。 long double
的范围比 unsigned long long
更大(因此 max
的值更大)但可能有更少的尾数位来保存值的最高有效位,从而为大值提供较低的精度。
最大unsigned long long
值为2^N-1
,其中N
为位数;大概 64.
如果 long double
的尾数位少于 N
,则转换会将其四舍五入为两个最接近的可表示值之一,也许 2^N
。这超出了 unsigned long long
的范围,因此转换回来会产生未定义的行为。也许它正在使用模块化算法减少到零(如果从整数类型转换会发生这种情况),但原则上任何事情都可能发生。
我有这样的程序:
#include "stdafx.h"
#include <iostream>
using namespace System;
using namespace std;
typedef long long unsigned int T_num;
typedef long double T_ld;
int main(array<System::String ^> ^args) {
T_num a = numeric_limits<T_num>::max();
T_ld b = numeric_limits<T_ld>::max();
if ( b > a ) {
cout << "decimal is bigger than integer" << endl;
} else {
cout << "integer is bigger than decimal" << endl;
}
T_num c;
b = a;
c = floor(b);
if ( c == a) {
cout << "OK" << endl;
} else {
cout << "dupa" << endl;
cout << c << endl;
cout << a << endl;
cout << b << endl;
}
system("pause");
return 0;
}
产生这样的输出:
decimal is bigger than integer
dupa
0
18446744073709551615
1.84467e+019
Press any key to continue . . .
如果b可以包含a,那为什么c是0?
嗯...它(网页)要求我提供更多详细信息,但我不确定我还能说什么... 我希望如果 a 适合 b 那么它应该能够将它从 b 转换回 c。
b
不一定包含a
,只是它的一个近似值。 long double
的范围比 unsigned long long
更大(因此 max
的值更大)但可能有更少的尾数位来保存值的最高有效位,从而为大值提供较低的精度。
最大unsigned long long
值为2^N-1
,其中N
为位数;大概 64.
如果 long double
的尾数位少于 N
,则转换会将其四舍五入为两个最接近的可表示值之一,也许 2^N
。这超出了 unsigned long long
的范围,因此转换回来会产生未定义的行为。也许它正在使用模块化算法减少到零(如果从整数类型转换会发生这种情况),但原则上任何事情都可能发生。