繁体   English   中英

AWK:计算数字的幂时得到+nan

[英]AWK: Getting +nan when calculating power of number

使用变量时的问题

echo ""| awk '{
x=-0.35
print x^1.35
print -0.35^1.35
}'

结果

+nan
-0.242377

使用 GNU awk

output 是正确的。

幂运算符^的优先级高于否定运算符。 因此, x^1.35(-0.35)^1.35 (非整数次方的负数是一个复数,解释为-nan ),但-0.35^1.35-(0.35^1.35) ,一个负正数正数的幂。

请参阅DYZ的答案。 我的回答现在看起来有点滑稽,但我认为出于教育目的至少应保留几天。


实际上,当正确括起来以产生相同的数学运算时,您的两个表达式都会产生+nan

echo ""| awk '{ x=-0.35; print x^1.35; print (-0.35)^1.35; x=0.35; print x^1.35; print (0.35)^1.35; }'
+nan
+nan
0.242377
0.242377

和 Perl 有同样的错误:

perl -le '$x = -0.35; print $x**1.35; print "" . (-0.35)**1.35; $x = 0.35; print $x**1.35; print "" . (0.35)**1.35; '
NaN
NaN
0.242377253454738
0.242377253454738

正如您现在可能已经猜到的那样,负数非整数次幂会产生NaN

perl -le 'for $y (qw(0.1 0.5 1 1.35 2)) { for $x (qw(-2 -0.35 -0.1)) { print join "\t", "($x)", "**$y", $x**$y; } }' 
(-2)    **0.1   NaN
(-0.35) **0.1   NaN
(-0.1)  **0.1   NaN
(-2)    **0.5   NaN
(-0.35) **0.5   NaN
(-0.1)  **0.5   NaN
(-2)    **1     -2
(-0.35) **1     -0.35
(-0.1)  **1     -0.1
(-2)    **1.35  NaN
(-0.35) **1.35  NaN
(-0.1)  **1.35  NaN
(-2)    **2     4
(-0.35) **2     0.1225
(-0.1)  **2     0.01

我怀疑 Perl 和 awk 使用类似的低级库,在这种情况下会产生NaN

在大学里,我被要求用整个学期学习复杂的数学,这是这个问题的数学核心:

-0.35^1.35 =
-0.35^(135/100) =
-0.35^(27/20) =
((-0.35^27))^1/20) =
(-0.00000000000049)^1/20 =
0.242377253454738i (or "nan" if constrained to real #s)

-0.35^1.35 =
-0.35^(135/100) =
-0.35^(27/20) =
-0.35^(54/40) =
((-0.35^54))^1/40) =
(2.397035107846411e-25)^1/40 =
0.242377253454738

-- 所以,答案是有两个答案。 你今天的新词是“复共轭”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM