您得到的结果与32位算术一致。如果不知道更多关于您的环境信息,就无法建议应该做什么。
假设所示代码是正在运行的代码,即您没有将任何内容转换为字符串或浮点数,则在C++中没有修复方法。它在您所展示的代码外部,并取决于环境。
由于Patrick McDonald和Treb都提出了输入精度和a-c误差的准确性,我想看一下这个问题。查看舍入误差的一种技术是区间算术,它使值表示的上限和下限显式(它们在浮点数中是隐含的,并且固定为表示的精度)。通过将每个值视为上限和下限,并通过扩展表示中的误差的边界(对于双倍精度值x,大约为x * 2 ^ -53),您会得到一个结果,该结果给出了一个值的下限和上限,考虑到最坏情况下的精度误差。
例如,如果您有一个范围在[1.0,2.0]中的值,并从其中减去一个范围在[0.0,1.0]中的值,则结果必须位于[below(0.0),above(2.0)]范围内,因为最小结果为1.0-1.0,而最大结果为2.0-0.0。below和above相当于floor和ceiling,但是对于下一个可表示的值而不是整数。
使用表示最坏情况下双重舍入的区间:
getSlope(
a = [2.7115599999999995262:2.7115600000000004144],
b = [-1.6416099999999997916:-1.6416100000000002357],
c = [2.7041299999999997006:2.7041300000000005888],
d = [-1.7221899999999998876:-1.7221900000000003317])
(d-b) = [-0.080580000000000526206:-0.080579999999999665783]
(c-a) = [-0.0074300000000007129439:-0.0074299999999989383218]
to double precision [10.845222072677243474:10.845222072679954195]
因此,尽管 c-a 与 c 或 a 相比较小,但仍然大于双重舍入,因此如果您使用的是最糟糕的双精度舍入,则可以相信该值精确到12个数字-10.8452220727。 您已经失去了一些双精度数字,但仍然可以更加准确地处理您的输入数据。
但是,如果输入只有几个有效数字,而不是双精度值2.71156 +/- eps,则输入范围将为[2.711555, 2.711565],因此您将得到以下结果:
getSlope(
a = [2.711555:2.711565],
b = [-1.641615:-1.641605],
c = [2.704125:2.704135],
d = [-1.722195:-1.722185])
(d-b) = [-0.08059:-0.08057]
(c-a) = [-0.00744:-0.00742]
to specified accuracy [10.82930108:10.86118598]
这是一个更广泛的范围。
但您需要费心去跟踪计算的准确性,而浮点数中固有的舍入误差在此示例中并不重要 - 即使采用最坏情况下的双精度舍入,它也精确到12个数字。
另一方面,如果您的输入只知道6个数字,那么无论您得到10.8557还是10.8452都没有关系。两者都在[10.82930108:10.86118598]之内。