假设您要将度数转换为弧度:
radians = degrees * (pi / 180)
如果pi被认为是用于此计算的常量,则结果弧度值应具有与初始度数相同的有效位数。即。
-32.39 degrees = -0.5653 radians # 4 significant digits
-32.38795 degrees = -0.5652763 radians # 7 significant digits
我很惊讶我找不到任何语言的例子来说明如何执行这个看似简单的操作。
我的第一个想法是:
degrees_str = degrees
# remove any non-significant leading zeros from degrees_str
# degree_digits = count the remaining digit characters in degrees_str
# radian_int_digits = count the digits in integer portion of the radians
# round radians to (degree_digits - radian_int_digits) digits after the decimal point
这是执行此一般计算类型的最有效方式(不是特定于度/弧度)吗?
答案 0 :(得分:4)
通常在计算中应用时,假设所有操作都会导致最后一个位置的间隔加宽,因此会产生悲观结果。
可以根据输入的已知精度设置间隔 - 如果你有pi = 3.142,那么你可以使pi恒定为区间[3.1415,3.1425]。
可以根据已知的输入精度设置间隔 - 如果你有pi = 3.142,那么你可以使pi恒定为间隔
假设8个sig figs用于间隔 - 你需要在间隔中比在值中更精确,
pi = [3.1415000, 3.1425000]. // pi to 4sf
angle = [-32.385000, -32.395000]. // angle to 4sf
degs_to_rads = pi / 180 // exact constant 180
= [0.017452776, 0.017458334]. // truncated and widened from [0.0174527778,0.0174583333]
rads = pi * angle / 180
= [-0.56556274,-0.56520814] // truncated and widened from [-0.56556273,-0.565208151]
width(rads) = abs(-0.56556274 - (-0.56520814)) = -0.0003546
所以如果你想将rads格式化为整数sig fig,你选择了有效数字,这样就不会看到间隔上的错误;在这种情况下
sf min max
8 -0.56556274 -0.56520814
5 -0.56556 -0.56521
4 -0.5656 -0.5652
3 -0.566 -0.565
2 -0.57 -0.57
因此,虽然对于四个有效数字的输入,间隔非常小,但结果只能精确到两个。
这类似于将结果引用为比使用的输入更少有效数字的常规做法,而不是您给出的假定完美精度的示例。
答案 1 :(得分:3)
浮点运算很复杂,正如Mark Ransom的回答所指出的那样。如果您正在编写科学或数学代码,请务必完全理解浮点运算。确保您完全理解IEEE格式,包括非规范化数字,以及常见的精度损失源。例如取消错误以及何时/何时IEEE数字被舍入......以及机器epsilon的概念。在我的大学里,有一个完整的课程......我相信这个领域远不止于此。
基本上,IEEE双精度数在尾数中存储53位,有点像15.9位的精度...但不是真的,因为尾数在base-2中,而说“15.9有效数字”意味着基数10.(log(2 ^ 53)是~15.9)总的来说,有效数字的概念在使用IEEE浮点数时根本没用。如果要保持准确性,最好完全理解浮点运算。
如果您真的需要实现有效数字,请帮个忙,避免使用双精度数字。将它们存储为整数。您可能有机会使用Base-10 IEEE编号,但只有C ++ 0x提及它们(我还不知道其他任何支持decimal64编号的编程语言)
答案 2 :(得分:2)
有效数字的概念在计算中没有多大价值,因为计算机不能用十进制数字。值-32.39可能在内部存储的方式使其更接近-32.38999999999999而不是-32.39000000000000。