Erlang 二郎;math.pow,为什么不默认为整数或为浮点/整数键入?
我认为Erlang可以处理任意精度的整数。但是看起来math.pow默认使用浮点: 使用linux实用程序Erlang 二郎;math.pow,为什么不默认为整数或为浮点/整数键入?,erlang,Erlang,我认为Erlang可以处理任意精度的整数。但是看起来math.pow默认使用浮点: 使用linux实用程序bc: 88^99 31899548991064687385194313314353745484864573065650712770111884048604\ 75359372836550565046276541670202826515718633320519821593616663471686\ 15196001878050884385170257392425027758403025717
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库都处理相同的整数。我在我的回复中添加了一个带有更多链接的编辑。