Erlang 二郎;math.pow,为什么不默认为整数或为浮点/整数键入?

Erlang 二郎;math.pow,为什么不默认为整数或为浮点/整数键入?,erlang,Erlang,我认为Erlang可以处理任意精度的整数。但是看起来math.pow默认使用浮点: 使用linux实用程序bc: 88^99 31899548991064687385194313314353745484864573065650712770111884048604\ 75359372836550565046276541670202826515718633320519821593616663471686\ 15196001878050884385170257392425027758403025717

我认为Erlang可以处理任意精度的整数。但是看起来math.pow默认使用浮点:

使用linux实用程序
bc

88^99
31899548991064687385194313314353745484864573065650712770111884048604\
75359372836550565046276541670202826515718633320519821593616663471686\
151960018780508843851702573924250277584030257178740785152
删除反斜杠:

3189954899106468738519431331435374548486457306565071277011188404860475359372836550565046276541670202826515718633320519821593616663471686151960018780508843851702573924250277584030257178740785152
在Erlang中:

float_to_list(math:pow(88,99),[{scientific,192}]).
"3.189954899106468677983468001676918389478607432406058411199358053788184470654582587122118156926366989707830958889227847846886750593566290713618113587727930256898153980172821794148406939795587072e+192"
并排:

bc:  3189954899106468738519431331435374548486457306565071277011188404860475359372836550565046276541670202826515718633320519821593616663471686151960018780508843851702573924250277584030257178740785152
erl: 3189954899106468677983468001676918389478607432406058411199358053788184470654582587122118156926366989707830958889227847846886750593566290713618113587727930256898153980172821794148406939795587072
我写了一个简单的函数:

integerpow(N, 1) -> N;
integerpow(N, M) -> N*integerpow(N, M-1).
这就产生了正确的答案


但是当两个参数都是整数时,似乎默认的行为应该产生正确的答案,为什么不呢?

因为
数学模块只包装了C库中的内容。正如上面所说:

漏洞 因为这些都是C库,所以bug是相同的

(尽管您可能会质疑返回浮点数而不是bignum是否是一个“错误”)

这也是
pow
的类型签名所说的:

pow(X, Y) -> float()

    Y = X = number()
也就是说,函数被指定为接受任何数字,即整数和浮点数,但始终返回浮点数


那为什么呢

对于向标准库添加bignum求幂函数是否会被接受,我找不到任何权威的答案,所以请尝试一下并提交一个pull请求!(或许如此。)


虽然我确实在erlang问题邮件列表中找到了(返回一个与基本参数类型相同的值),并且讨论了一个类似的主题,并且讨论了如何使用非常大的数字,甚至比bignums更大。

因为
数学模块只包装了C库中的内容。正如上面所说:

漏洞 因为这些都是C库,所以bug是相同的

(尽管您可能会质疑返回浮点数而不是bignum是否是一个“错误”)

这也是
pow
的类型签名所说的:

pow(X, Y) -> float()

    Y = X = number()
也就是说,函数被指定为接受任何数字,即整数和浮点数,但始终返回浮点数


那为什么呢

对于向标准库添加bignum求幂函数是否会被接受,我找不到任何权威的答案,所以请尝试一下并提交一个pull请求!(或许如此。)


虽然我在erlang问题邮件列表中找到了(返回与基本参数类型相同的值),并且讨论了一个类似的主题,讨论了如何使用非常大的数字,甚至比bignums更大。

erlang,就这一点而言,任何库,甚至是简单的计算器,不要天真地将数字乘以几倍来计算大整数幂。他们使用一个特殊的数学公式,叫做。它通过多项式近似计算功率。对于较小的数字,近似值是精确的,但对于较大的数字,近似值的精度越来越低,这当然取决于底层库中实现的精度。是的类NIF代理

编辑:

这似乎是一个问题

在math.stackexchange.com上还有一个问题,该问题引用了相同的数据源


那么,你已经在问题本身中回答了你的问题。Erlang处理任意精度的整数,但模块
math
不处理,默认情况下它使用
float

Erlang,因此,任何库,甚至简单的计算器,都不会通过简单地将数字乘以多次来计算大整数幂。他们使用一个特殊的数学公式,叫做。它通过多项式近似计算功率。对于较小的数字,近似值是精确的,但对于较大的数字,近似值的精度越来越低,这当然取决于底层库中实现的精度。是的类NIF代理

编辑:

这似乎是一个问题

在math.stackexchange.com上还有一个问题,该问题引用了相同的数据源


那么,你已经在问题本身中回答了你的问题。Erlang处理任意精度的整数,但模块
math
不处理,默认情况下它使用
float

这个答案基本上说“答案是错误的,因为他们想让它变得高效而不是正确”。是的,
math
就是这样实现的。它使用浮点数来计算幂并返回近似结果,就像所有使用浮点数的库一样。ErlangVM本身处理大整数,但这并不意味着所有OTP库都处理相同的整数。我在我的回复中添加了一个带有更多链接的编辑。这个答案基本上是说“答案是错误的,因为他们觉得它是有效的,而不是正确的”。是的,这就是
数学
的实现方式。它使用浮点数来计算幂并返回近似结果,就像所有使用浮点数的库一样。ErlangVM本身处理大整数,但这并不意味着所有OTP库都处理相同的整数。我在我的回复中添加了一个带有更多链接的编辑。