2016年8月27日土曜日

PerlでNaNを使う.

Perlで数値解析をする際,ゼロ除算を適切に扱う必要がある.Perlはv5.6.1以上であればNaNを使える.NaNはどんな演算をしてもNaNとなるが,実数NaN共にゼロ除算ではエラーを吐いて止まってしまう.ゼロ除算時にNaNを発生し伝搬させるためには,分母が0であればNaNとなる様な関数を書いてやればよい(下の例ではsub DivNaN).
ちなみに無限も'inf'として使える.
  1. #!/bin/perl
  2. $value = 10;
  3. $value = &DivNaN($value , 20);
  4. printf("10/20= $value\n");
  5.  
  6. $value = &DivNaN('inf' , 20);
  7. printf("inf/20= $value\n");
  8.  
  9. $value = &DivNaN('nan' , 20);
  10. printf("nan/20= $value\n");
  11.  
  12. $value = &DivNaN(10 , 0);
  13. printf("10/0= $value\n");
  14.  
  15. $value = &DivNaN('nan' , 'nan');
  16. printf("nan/nan= $value\n");
  17.  
  18. $value = &DivNaN('nan' , 0);
  19. printf("nan/0= $value\n");
  20.  
  21. sub DivNaN {
  22. my ($numerator, $denominator) = @_;
  23. if ($denominator eq 0){
  24. return 'nan';
  25. } else {
  26. return $numerator / $denominator;
  27. }
  28. }
  1. % perl test.pl
  2. 10/20= 0.5
  3. inf/20= inf
  4. nan/20= nan
  5. 10/0= nan
  6. nan/nan= nan
  7. nan/0= nan

2016年8月26日金曜日

octaveで関数プロット時に"error: expecting integer index..."と表示されエラーになる

octave では変数や関数を自作する事ができるが,変数と関数に同じ名前をつけることが出来ない.関数を変数で上書きした後に関数を呼び出すと,"error: expecting integer index..."とエラーになる.

octave:1> sin(pi)
ans =  1.2246e-16
octave:2> sin=10
sin =  10
octave:3> sin(pi)
error: expecting integer index, found 3.141593 ← エラーになる
octave:3> clear sin
octave:4> sin(pi)
ans =  1.2246e-16
octave:5> 

はまったのでメモ.

参考リンク.ハンガリー語のスライド.
http://xymarkus.web.elte.hu/Jegyzet/Fiznum_1_ea-10-11_csabai/lecture02.pdf