bja*_*jar 3 c++ precision double function digit
我需要一个降低双精度精度(位数)的函数。
我需要它用于计算,而不是用于屏幕上的输出。
到目前为止,我所拥有的是:
double setDigits(double _number, int _digits)
{
double tenth = pow((double)10,_digits);
_number *= tenth;
_number = floor(_number);
_number /= tenth;
return _number;
}
Run Code Online (Sandbox Code Playgroud)
调用setDigits(sqrt(2),3)给出 1.4139999999999999,而不是我想要的 1.414。
我能做什么?
我能做什么?
不幸的是,根本问题没有任何意义:在您的平台中,1.414 没有精确的双重表示。你不能用“1.414”运行计算,因为你不能把“1.414”在任何地方你 double。
参见例如http://www3.ntu.edu.sg/home/ehchua/programming/java/DataRepresentation.html。
您可以做的是以最大精度保持您的数字,并以降低的精度显示它。您需要计算机器精度并跟踪计算过程中的错误。
因此,您将使用 1.413999999999997,最后得到的答案是 41.99999137;你会用它来显示
printf("The answer is %.3f\n", theAnswer);
Run Code Online (Sandbox Code Playgroud)
或者您可以更改平台(编译器、数学库或浮点表示,例如long double在支持的地方使用),但请记住,您可以以得到 1.873 错误的代价获得 1.414(例如 1.87299999999 或 1.87300000001) ,并且计算或多或少会有相同的误差。
您可以使用整数算术,将初始数字乘以 1,000,000(并得到 1414000)或其他合适的比例,然后在最后进行除法。不过,整数有一个最大界限。
还有一些任意精度库使用不同的内部表示,并允许您以所需的方式指定精度,例如 GMP ( http://gmplib.org/ )。当然,使用它比指定更困难
op1 = 6.0;
op2 = 7.0;
theAnswer = op1 * op2;
Run Code Online (Sandbox Code Playgroud)
处理速度也较慢,但结果很好——或者和你告诉他们的一样好。