質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

Q&A

解決済

3回答

992閲覧

perl if文 一行 実行前文のバグ??

shiroikuma

総合スコア11

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

0グッド

0クリップ

投稿2018/12/06 06:09

編集2018/12/06 06:58

なぜかわからないので教えてください。

仕事で古いperl スクリプトのメンテナンスを担当しているのですが、
if 文の記載の仕方で結果が異なることがありました。
文法的には正しく見えるのに。。なぜかわかる方いますでしょうか??
perl のversion は v5.8.8 です。

##修正前

my($LATMAX,$LATMIN,$LONMAX,$LONMIN)=(-90,90,-360,720); foreach my $f (split(',', $outstr)){ my $file = "$BASE_DIR/$f.cdf"; my($lat_max,$lat_min,$lon_max,$lon_min) = &read_file( $file );    print "lat_max,lat_min,lon_max,lon_min = $lat_max,$lat_min,$lon_max,$lon_min\n"; $LATMAX = $lat_max if ($LATMAX < $lat_max); $LONMAX = $lon_max if ($LONMAX < $lon_max); $LATMIN = $lat_min if ($LATMIN > $lat_min); $LONMIN = $lon_min if ($LONMIN > $lon_mim); }

結果
loop 1回目
lat_max,lat_min,lonmax,lonmin = 45.0771311169872,37.3816325368991,331.308254870577,320.359240081112
LATMAX,LATMIN,LONMAX,LONMIN = 45.0771311169872,37.3816325368991,331.308254870577,320.359240081112
loop 2回目
lat_max,lat_min,lonmax,lonmin = 45.4778632422891,35.6423653537993,331.41255387756,324.856717470009
LATMAX,LATMIN,LONMAX,LONMIN = 45.4778632422891,35.6423653537993,331.41255387756,324.856717470009
==>$LONMIN = $lon_min if ($LONMIN > $lon_min); が効いてない??

##修正後

my($LATMAX,$LATMIN,$LONMAX,$LONMIN)=(-90,90,-360,720); foreach my $f (split(',', $outstr)){ my $file = "$BASE_DIR/$f.cdf"; my($lat_max,$lat_min,$lon_max,$lon_min) = &read_file( $file ); print "lat_max,lat_min,lon_max,lon_min = $lat_max,$lat_min,$lon_max,$lon_min\n"; if ($LATMAX < $lat_max){$LATMAX = $lat_max;} if ($LONMAX < $lon_max){$LONMAX = $lon_max;} if ($LATMIN > $lat_min){$LATMIN = $lat_min;} if ($LONMIN > $lon_min){$LONMIN = $lon_min;} print "LATMAX,LATMIN,LONMAX,LONMIN = $LATMAX,$LATMIN,$LONMAX,$LONMIN\n"; }

結果
loop 1回目
lat_max,lat_min,lonmax,lonmin = 45.0771311169872,37.3816325368991,331.308254870577,320.359240081112
LATMAX,LATMIN,LONMAX,LONMIN = 45.0771311169872,37.3816325368991,331.308254870577,320.359240081112
loop 2回目
lat_max,lat_min,lonmax,lonmin = 45.4778632422891,35.6423653537993,331.41255387756,324.856717470009
LATMAX,LATMIN,LONMAX,LONMIN = 45.4778632422891,35.6423653537993,331.41255387756,320.359240081112
if ($LONMIN > $lon_min){$LONMIN = $lon_min;} は正しい。

となりました。
文法的にはどちらも正しそうなのに、結果が変わりました。。なぜなんでしょうか?
調べてもわからなかったのでこちらで質問しました。
同じような経験がある方、どうか理由を教えていただければと思います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

文法的にはどちらも正しいです。
その2つの書き方で実行結果が異なるのでしょうか?

結果についてですが、、、

Pel

1if ($LONMIN > $lon_min){$LONMIN = $lon_min;}

に対して、$LONMIN=320.359240081112 と $lon_min=324.856717470009 ですよね?
結果は、$LONMIN=320.359240081112 のままで正しいように見えますが。

投稿2018/12/06 06:47

ssasaki

総合スコア1167

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ssasaki

2018/12/06 06:48

ああ、すみません。間違えました。修正前の結果が正しくないのですね。
ssasaki

2018/12/06 06:52

修正前の方はprint文がないので、念のためその結果が出力されるprint文付きの完全なコードを載せておいた方がよいかもです。
shiroikuma

2018/12/06 06:55

ご指摘ありがとうございます。修正します。
guest

0

ちょっと確実な情報ではないですが、浮動小数点精度ではないでしょうか。
プログラムで扱える小数点の最大桁数ですね。
見た目そのまま全ての桁数を扱えるわけではないので、その観点からもう少し調べてみてください。

※一応同じような経験はあるのですが、あくまでPHPとの浮動小数点桁数の精度の違いで苦労した話(しかもかなり前)なので本件の直接解決的な回答は出来ません

投稿2018/12/06 06:13

m.ts10806

総合スコア80765

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shiroikuma

2018/12/06 06:29

回答ありがとうございます。 試しに、$lat_max,$lat_min,$lon_max,$lon_min の浮動小数点精度を.5%f にしてみましたが、結果変わらず、でした。
m.ts10806

2018/12/06 06:41

了解です。 同じ処理内容で結果が違う場合は大体データを疑うのでその観点からの回答でした。 お力になれず申し訳ないです
guest

0

自己解決

こちらですが、、
該当箇所を抜き出し、別スクリプトでテストさせてみたところ、なんてことはなく
元スクリプトのタイプミスでした。。お騒がせいたしました。。
元スクリプトには、use strict,use warningsが付いておらず、
該当部分だけを抜き出して、use strict use warningsをつけたら試験してみたところ、
$lon_mim にエラーが出ました。
$lon_mim => $lon_min に修正したところ、正しい結果になりました。

$LONMIN = $lon_min if ($LONMIN > $lon_min);

投稿2018/12/06 08:35

shiroikuma

総合スコア11

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問