您得到的结果与 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]
因此,虽然与orc-a
相比很小,但与双舍入相比仍然很大,所以如果您使用可想象到的最差的双精度舍入,那么您可以相信该值精确到 12 位数字 - 10.8452220727。您在双精度方面丢失了一些数字,但您仍在努力超越输入的重要性。c
a
但是,如果输入仅精确到有效数字,而不是双精度值 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] 之内。