fmod的输出问题(long double,long double)
在这个测试中,似乎fmod(long double,long double)的输出是有问题的。 有什么建议吗?
g ++ --version g ++(GCC)4.9.2
uname -srvmpio CYGWIN_NT-6.1 1.7.34(0.285 / 5/3)2015-02-04 12:12 i686未知未知Cygwin
g ++ test1.cpp //没有错误,没有警告
./ A.EXE
l1 = 4294967296
l2 = 72057594037927934
l3 = 4294967294
d1 = 4294967296
d2 = 72057594037927934
d3 = 0 //预期4294967294
// -------- Program test1. cpp --------
#include <iostream>
#include <iomanip>
#include <cmath>
int main (int argc, char** argv)
{
long long l1 = 4294967296;
long long l2 = 72057594037927934;
long long l3 = l2 % l1;
long double d1 = static_cast<long double>(l1);
long double d2 = static_cast<long double>(l2);
long double d3 = fmod (d2, d1);
std::cout << "l1 = " << l1 << std::endl;
std::cout << "l2 = " << l2 << std::endl;
std::cout << "l3 = " << l3 << std::endl;
std::cout << std::endl;
std::cout << "d1 = " << std::setprecision(18) << d1 << std::endl;
std::cout << "d2 = " << std::setprecision(18) << d2 << std::endl;
std::cout << "d3 = " << std::setprecision(18) << d3 << std::endl;
return 0;
}
// -----------------------
答案 0 :(得分:0)
浮点类型(包括long double
)不能代表其范围内的所有整数值。在实践中,他们不太可能精确地支持更大的数值。
结果是将大整数值转换为long double
(或任何浮点类型)不一定保留值 - 转换后的值只是给定浮点类型限制时可能的最接近值。
从那里开始,如果你的两次转换产生了不同的值,那么如果fmod()
的结果正是你所寻找的值,那将非常幸运。
fmod()
也不会重载以接受long double
个参数。这意味着您的long double
值将转换为double
。 double
可以表示的值集是long double
可以表示的集合的子集。除此之外,这意味着可以精确表示的较小范围的整数值。
通常的建议是不做这样的事情。如果您可以使用整数运算(如%
)执行必需的操作,那么就这样做。而且,如果使用浮点,则需要允许并管理与使用浮点相关的精度损失。