【发布时间】:2017-08-26 00:39:31
【问题描述】:
Math.pow()、pow(),不管叫什么,很多语言(和计算器)都有一些内置函数来计算浮点数(或双精度数)的 x=a^b。有 a 为负数且 b 不是整数的特殊情况。有些会返回NaN,有些会给出复杂的结果(咳咳Python)。但有些实际上能够给出真正的结果,所以我想知道的是如何。为了解释我的困惑:
假设 b 是有理数:b=c/d。现在我们看看c和d的奇偶校验:
d 是偶数:没有实数 x -> NaN 或错误
d 为奇数,c 为偶数:正 x
d 为奇数,c 为奇数:负 x
浮点数存储在a particular format 中,这意味着如果按字面解释,它始终是偶数 d(实际上是 2 的幂)。没有办法知道 c 和 d 的真正奇偶校验,因为该信息在计算中丢失了。它只需要猜测。
所以我猜测它在做什么——它试图找到一个接近 b 的有理 c/d,d 为奇数,并且 c 和 d 都小于某个阈值 t。较小的 t 意味着它可以更确定它是正确的,但它会在更少的数字上起作用。如果成功,它使用 c 的奇偶校验。否则它假装 d 是偶数。毕竟,浮点数可以是任何东西,数学库不想通过假设它是合理的而给出可能错误的结果。
不过,这只是我的猜测。如果有人真正看到过这些幂函数(或规范,同样好)中的代码并且可以提供见解,那就太好了。
【问题讨论】:
-
如果您给出“实际上能够给出真实结果”的语言和计算器的示例,将会有很大帮助。我唯一知道的是 TI Nspire CX 手持式图形计算器,而且我相信德州仪器 (Texas Instruments) 因保持其计算器源代码不开放而臭名昭著(尽管他们使用计算器打开了一些软件)。
-
对于非整数指数,你会得到 复根;对于无理指数,你会得到无穷多个。您可以使用数学恒等式来解决
Math.pow的限制 - 请参阅 欧拉恒等式 和 De Moivre 定理 -
能举出具体的例子吗?我觉得这个问题令人困惑。如前所述,所有数字二进制浮点数都是有理数(即分数),其中 d 为偶数(即 2 的幂)。如果“奇偶校验”指的是整数的奇数或偶数属性,我们因此知道 d 是偶数,而浮点数的位模式告诉我们 c 是奇数还是偶数。所以我不理解“由于信息丢失,无法知道 c 和 d 的真正奇偶性”的说法。
-
如果将浮点数替换为它所精确表示的约简分数,它要么是整数,要么分母一定是偶数而分子一定是奇数(认为是约数)。因此,您绝不可能返回真正的结果...
标签: math floating-point rational-number