gpt4 book ai didi

perl - 如何在不丢失精度的情况下打印 Perl bignum?

转载 作者:行者123 更新时间:2023-12-01 05:05:11 25 4
gpt4 key购买 nike

#!/usr/bin/perl
use strict;
use warnings;
my $s = "1234567890.123456789";
{
no bignum; printf "bignum==%s\n", bignum::in_effect() // 0;
my $x = $s;
printf "%29s\n", $x;
printf "%29.9f\n\n", $x;
}
{
use bignum; printf "bignum==%s\n", bignum::in_effect() // 0;
my $x = $s;
printf "%29s\n", $x;
printf "%29.9f\n\n", $x;
}

我的 Perl 的 printf(为 darwin-thread-multi-2level 构建的 ActiveState v5.10.1)使用 %f 转换不支持超过 1e-6 位的值,即使使用 bignum:

$ t.pl
bignum==0
1234567890.123456789
1234567890.123456717

bignum==1
1234567890.123456789
1234567890.123456717

如何在不丢失精度的情况下打印我的输入?

我的真正问题是我将需要操纵这个数字(例如,$x/0.000_000_001,或者更糟糕的是,$x/0.000_001_024,我无法伪造使用 substr() 函数调用),但当前的消减已经让我很难过,我什至还没有进入“有趣”的部分。

最佳答案

Perl 的 printf 并没有真正做 bignums。使用 Math::BigFloat 之一获取字符串的方法。自从做了

my $x = $s;

只需复制字符串,您必须执行类似的操作

my $x = 0+$s; 

所以 $x 是一个 Math::BigFloat。然后像

printf "%29s\n", $x->ffround(-9);

应该做你想做的。

关于perl - 如何在不丢失精度的情况下打印 Perl bignum?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5426791/

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