Perl可以检测浮点数是否已被隐式舍入?

Perl可以检测浮点数是否已被隐式舍入?,第1张

概述当我使用代码时: (sub { use strict; use warnings; print 0.49999999999999994;})->(); Perl输出“0.5”. 当我从数字中删除一个“9”时: (sub { use strict; use warnings; print 0.4999999999999994;})->(); 它 当我使用代码时:

(sub {    use strict;    use warnings;    print 0.49999999999999994;})->();

Perl输出“0.5”.

当我从数字中删除一个“9”时:

(sub {    use strict;    use warnings;    print 0.4999999999999994;})->();

它打印0.499999999999999.

只有当我删除另外9个时,它才能准确地存储数字.

我知道浮点数是一个没有人想要处理的蠕虫,但我很好奇Perl中有一种方法可以“陷阱”这个隐式转换并死掉,这样我就可以使用eval来捕获这个死了用户知道Perl以其原生形式支持他们试图传递的号码(因此用户可以传递字符串或对象).

我需要这个的原因是为了避免传递0.49999999999999994被我的函数舍入的情况,但数字转换为0.5,然后舍入为1而不是0.我不知道如何“拦截”这个转换,以便我的函数“知道”它实际上没有得到0.5作为输入,但是用户的输入被截获.

在不知道如何拦截这种转换的情况下,我不能相信“圆”,因为我不知道它是否在我发送它时收到了我的输入,或者是否在修改之前(在编译时或运行时,不确定)输入函数被调用(反过来,函数不知道它正在 *** 作的输入是否是用户想要的输入,并且无法警告用户).

这不是Perl的独特问题,它发生在JavaScript中:

(() => {    'use strict';    /* oops: 1 */    console.log(Math.round(0.49999999999999999))})();

它发生在Ruby中:

(Proc.new {    # oops: 1     print (0.49999999999999999.round)}).call()

它发生在PHP中:

<?PHP(call_user_func(function() {    /* oops: 1 */    echo round(0.49999999999999999);}));?>

它甚至发生在C(这是可以发生的,但我的gcc并没有警告我数字没有精确存储(当指定特定的浮点文字时,最好准确存储它们,或者编译器应警告你它决定把它变成另一种形式(例如“你的数字x不能以64位/ 32位浮点形式表示,所以我把它转换为y.”)所以你可以看看是否可以,在这种情况下它是不)):

#include <math.h>#include <stdio.h>int main(int argc,char **argv){    /* oops: 1 */    printf("%f.\n",round(0.49999999999999999));    return 0;}

摘要:

是否有可能在浮动数字的隐式转换中使Perl显示错误或警告,或者这是Perl5(以及其他语言)此时无法执行的 *** 作(例如,编译器不会超出其支持方式这样的警告/提供一个标志来启用此类警告)?

例如

warning: the number 0.49999999999999994 is not representable,it has been converted to 0.5. using bigint might solve this. ConsIDer reducing precision of the number.

解决方法 也许使用 BigNum:

$perl -Mbignum -le 'print 0.49999999999999994'0.49999999999999994$perl -Mbignum -le 'print 0.49999999999999994+0.1'0.59999999999999994$perl -Mbignum -le 'print 0.49999999999999994-0.1'0.39999999999999994$perl -Mbignum -le 'print 0.49999999999999994+10.1'10.59999999999999994

它透明地将Perl浮点和整数的精度扩展到扩展精度.

总结

以上是内存溢出为你收集整理的Perl可以检测浮点数是否已被隐式舍入?全部内容,希望文章能够帮你解决Perl可以检测浮点数是否已被隐式舍入?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1245136.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存