【发布时间】:2021-05-20 23:05:03
【问题描述】:
我目前对类方法Float>>asFraction 及其各种形式提供的响应感到困惑。以下是几个例子:
GNU Smalltalk
0.001 asFraction
1/1000
0.001 asExactFraction
1152921504606847/1152921504606846976
法罗
0.001 asFraction
1152921504606847/1152921504606846976
0.001 asTrueFraction
1152921504606847/1152921504606846976
0.001 asMinimalDecimalFraction
1/1000
0.001 asApproximateFraction
1/1000
出于显而易见的原因,GNU 的 asFraction 和 Pharo 的 asMinimalDecimalFraction 和 asApproximateFraction 对我来说最有意义,因为它们在数学上产生了更“精确”的结果。我不明白其他人。为什么分子和分母很大但值明显不太精确的分数会是对asExactFraction 的响应?为什么我会想要这样的回应?为什么在 Pharo 中我选择 asFraction 或 asTrueFraction 似乎并不重要?为什么会有这些变种?
如果我想将浮点数表示为分数,我想我可能想要基于构成分子和分母的整数的精度等级,或者基于最大分母的最接近近似值。
我查看了 Bluebook,它几乎没有提到 asFraction,也没有提到任何变体。
【问题讨论】:
-
您认为哪个更准确,1/1000 还是 1152921504606847/1152921504606846976?你知道 0.001 不能用二进制精确表示吗?有关详细信息,请参阅 xhttps://stackoverflow.com/questions/1089018/why-cant-decimal-numbers-be-represented-exactly-in-binary。
-
@JamesFoster 我明白 1/1000 不能精确地表示为作为二进制浮点数。但是,作为表示为两个 整数 分子 1 和分母 1000 的比率的分数,比给出的替代方案更精确。所以你说的是“精确”他们真正的意思是,在尝试用二进制浮点数表示 0.001 之后,你实际上得到 1152921504606847/1152921504606846976,那么这是对精确的不同看法。我不清楚这是什么意思。
标签: floating-point precision smalltalk fractions