fmod的输出有问题(长双,长双)

时间:2016-02-11 09:38:08

标签: c++ g++ fmod

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;

}
// -----------------------

1 个答案:

答案 0 :(得分:0)

浮点类型(包括long double)不能代表其范围内的所有整数值。在实践中,他们不太可能精确地支持更大的数值。

结果是将大整数值转换为long double(或任何浮点类型)不一定保留值 - 转换后的值只是给定浮点类型限制时可能的最接近值。

从那里开始,如果你的两次转换产生了不同的值,那么如果fmod()的结果正是你所寻找的值,那将非常幸运。

fmod()也不会重载以接受long double个参数。这意味着您的long double值将转换为doubledouble可以表示的值集是long double可以表示的集合的子集。除此之外,这意味着可以精确表示的较小范围的整数值。

通常的建议是不做这样的事情。如果您可以使用整数运算(如%)执行必需的操作,那么就这样做。而且,如果使用浮点,则需要允许并管理与使用浮点相关的精度损失。