【发布时间】:2019-07-15 11:37:14
【问题描述】:
这是我正在进行的测试的bank,了解FP 基本操作(+、-、*、/)如何引入错误:
#include <iostream>
#include <math.h>
int main() {
std::cout.precision(100);
double a = 0.499999999999999944488848768742172978818416595458984375;
double original = 47.9;
double target = original * a;
double back = target / a;
std::cout << original << std::endl;
std::cout << back << std::endl;
std::cout << fabs(original - back) << std::endl; // its always 0.0 for the test I did
}
你能告诉我两个值(original 和 a),一次是 *(或 /),由于 FP 数学,引入错误?
如果它们存在,是否可以确定该错误是由* 还是/ 引入的?如何? (因为你需要两者来恢复价值;80 bit?)
使用+ 很容易(只需将0.499999999999999944488848768742172978818416595458984375 添加到0.5,您就会得到1.0,至于0.5 + 0.5)。
但我无法对 * 或 / 做同样的事情。
【问题讨论】:
-
0.499999999999999944488848768742172978818416595458984375 * 2? -
你的意思是被零除?或者你所说的“错误”是什么意思?
-
@NathanOliver:不,它的 0 coliru.stacked-crooked.com/a/c4f1b2d8b9861ad9
-
另请注意,如果系统将 IEEE754 用于浮点值,那么对于双精度,精度只有小数点后 17 位,超出此范围的任何内容都会导致精度损失。跨度>
-
@Someprogrammerdude:我知道。我只是想证明这一点,因此将两个值相乘(并返回原始值)会引入错误(即在
*或/上出现偏差)。
标签: c++ floating-point floating-accuracy