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

问题描述 投票:0回答:2

使用变量时的问题

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

结果

+nan
-0.242377

使用 GNU awk

math awk floating-point nan
2个回答
5
投票

输出是正确.

幂运算符

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


0
投票

@Ivan:理解为什么

nan
的最简单方法是使用
gawk
探查器向您展示
awk
究竟如何查看您的代码,并注意最后打印语句中的
(…)


those 5 expressions in 2nd print statement AREN'T all 
equivalent to each other, just partial subsets among them,
as seen when plugging in a positive value for x instead

gawk -p- -v PREC=65536 -Mbe 'BEGIN { OFMT = "%.37g"; OFS = "\f\r\t"

   for(x = -0.35; x < 1; x += 0.7) { 

      print x, x^1.35, 
                       (-0.35)^1.35 
      print "-----", 
               x^exp(1/2), x^exp(1)^2^-1, x^sqrt(exp(1)), 

            " { -*-*-*-*- }", sqrt(x^exp(1)), x^(exp(1)/2)

      print "———"
      print -(-0.35)^1.35, -0.35^1.35 }  }'

-0.35
    +nan
    +nan
-----
    +nan
    +nan
    +nan
     { -*-*-*-*- }
    +nan
    +nan
------
-nan
    -0.2423772534547380715986015819725977279

0.35
    0.2423772534547380715986015819725977279
    +nan
-----
    0.1771312905039259557488872422384548101
    0.1771312905039259557488872422384548101
    0.1771312905039259557488872422384548101
     { -*-*-*-*- }
    0.2400624449792419477761639194880532529
    0.2400624449792419477761639194880532529
------
-nan
    -0.2423772534547380715986015819725977279

    # gawk profile, created Mon Apr  3 23:18:54 2023

    # BEGIN rule(s)

    BEGIN {
     1      OFMT = "%.37g"
     1      OFS = "\f\r\t"

     2      for (x = -0.35; x < 1; x += 0.7) {

     2          print x, x ^ 1.35, (-0.35) ^ 1.35

     2          print "-----",    x ^ exp(1 / 2), x ^ exp(1) ^ 2 ^ -1, 
                                                  x ^ sqrt( exp(1) ), 
                " { -*-*-*-*- }", 
                                  sqrt(x ^ exp(1)), x ^ (exp(1) / 2)

     2          print "------"
     2          print -(-0.35) ^ 1.35, -(0.35 ^ 1.35)
        }
    }

 
© www.soinside.com 2019 - 2024. All rights reserved.