gpt4 book ai didi

perl - Perl 可以检测 float 是否已隐式舍入吗?

转载 作者:行者123 更新时间:2023-12-04 23:40:18 33 4
gpt4 key购买 nike

当我使用代码时:

(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 作为输入,但是用户的输入被截获了。

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

这不是 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 可以检测 float 是否已隐式舍入吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39551006/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com