Indexへ
(1027)//【966】→(968)
------------------------
【タイトル】単精度、倍精度
【記事番号】 966 (*)
【 日時 】03/01/30 20:26
【 発言者 】tomato ten2@hotmail.com

どなたか教えてください。
JWC用の外部変形をJWWで使いたいのですが
(座標値をtxtで保存しJWWで測量座標に変換して読み込ませるAWK)
JWCで使ってる外部変形はJWWで使っても単精度で書き出されるのでしょうか?
ちなみに外部変形の設定では小数点4桁で四捨五入されてます。
誤差があるとしたら10000mmでどの位の距離になりますか?
あと角度とかも心配です。


Indexへ
(966)←【968】→(975)
------------------------
【タイトル】Re(1):単精度、倍精度
【記事番号】 968 (966)
【 日時 】03/01/30 21:01
【 発言者 】牛渡

awk スクリプトの書き方によりますが、JWW 内部では倍精度で扱われます。
ちなみに JWC 時代のスクリプトによく使用されていた %e という出力の仕方は
若干精度が落ちるようです。精度を求めるならば、%e の部分を %.15f のように
書き換えるといいようです。 (Jww からの出力をみていると小数点以下は 11桁
程度ですので、%.11f くらいでも充分だと思います。)

>ちなみに外部変形の設定では小数点4桁で四捨五入されてます。

これは、精度 0.1 mm ということでしょうか? この程度だったら単精度でも
さほど問題にならないと思うんですが。

>あと角度とかも心配です。

内部の計算方法にもよるんでしょうが、一応三角関数を用いた計算で、R=100m
程度の計算をさせる外部変形で、計算誤差は最大で、0.0001 mm ぐらいでした。
あまり参考にならないかもしれませんが、とりあえず。


Indexへ
(968)←【975】→(976)
------------------------
【タイトル】Re(2):単精度、倍精度
【記事番号】 975 (968)
【 日時 】03/01/31 01:29
【 発言者 】tomato ten2@hotmail.com

▼牛渡さん:
>ちなみに JWC 時代のスクリプトによく使用されていた %e という出力の仕方は
>若干精度が落ちるようです。精度を求めるならば、%e の部分を %.15f のように
>書き換えるといいようです。

ありがとうございます。
JWCで測定した距離や角度のポイントを現場で測設するのだったら
単精度でも倍精度もあまり気にする数値ではなのですね。
安心しました。
ところでAWKの精度を上げるのでしたら下に書いてある%eを全部
変えればよろしいのでしょうか?

    rad=atan2(ly,lx)
    x1=cos(rad)*rr
    y1=sin(rad)*rr
    printf(" %e %e %e %e\n",xc-x1,yc-y1,xc-lx,yc-ly);
    printf(" %e %e %e %e\n",xc-x1,yc+y1,xc-lx,yc+ly);
    printf(" %e %e %e %e\n",xc+x1,yc+y1,xc+lx,yc+ly);
    printf(" %e %e %e %e\n",xc+x1,yc-y1,xc+lx,yc-ly);


Indexへ
(975)←【976】→(977)
------------------------
【タイトル】Re(3):単精度、倍精度
【記事番号】 976 (975)
【 日時 】03/01/31 06:13
【 発言者 】牛渡

>    printf(" %e %e %e %e\n",xc-x1,yc-y1,xc-lx,yc-ly);

printf(" %.15f %.15f %.15f %.15f\n",xc-x1,yc-y1,xc-lx,yc-ly);

または

printf(" %.11f %.11f %.11f %.11f\n",xc-x1,yc-y1,xc-lx,yc-ly);

のようになれば、 OK です。

> JWCで測定した距離や角度のポイントを現場で測設するのだったら
> 単精度でも倍精度もあまり気にする数値ではなのですね。

そうですね。事実、JWCの頃から 測量ユーティリティ S_UTIL などは
広く利用されていますし、JWW になって PfOX + P_UTIL のように
更に利用しやすく発展しています。


Indexへ
(976)←【977】→(979)
------------------------
【タイトル】Re(3):単精度、倍精度
【記事番号】 977 (975)
【 日時 】03/01/31 06:59
【 発言者 】名無し

▼牛渡さん:
>ちなみに JWC 時代のスクリプトによく使用されていた %e という出力の仕方は
>若干精度が落ちるようです。精度を求めるならば、%e の部分を %.15f のように
>書き換えるといいようです。

%.15f は小数点以下を15桁と指定する書式です、この場合図面の縮尺によっては
不適切と思われます
%.15g とすると有効数字の最大桁数を15桁とする書式です、これなら尺度が100倍でも1/100でも小数点の位置に影響されません
ほんの微々たる差ですが、精度にこだわるのなら

▼tomatoさん:
> ところでAWKの精度を上げるのでしたら下に書いてある%eを全部
>変えればよろしいのでしょうか?
>
>    printf(" %e %e %e %e\n",xc-x1,yc-y1,xc-lx,yc-ly);
>    printf(" %e %e %e %e\n",xc-x1,yc+y1,xc-lx,yc+ly);
>    printf(" %e %e %e %e\n",xc+x1,yc+y1,xc+lx,yc+ly);
>    printf(" %e %e %e %e\n",xc+x1,yc-y1,xc+lx,yc-ly);
>

数値の出力桁数はこれで細かくなりますが、スクリプト中に数値を文字化する様な
処理が有るとそこで、精度を落とします

これはスクリプト全体を検証しないと何とも言えません

数値を文字化する場合(数値変数に文字を追加したり、文字関数の因数とした場合)環境変数 CONVFMT の書式に従います

CONVFMT の初期値は "%.6g" です(最大桁数6桁)

おそらく、スクリプト先頭に

BEGIN パターンが有ると思いますので、そこで CONVFMT="%.15g" と設定すれば
文字化によって精度を落とす事は無くなります

他に sprintf 関数を使用していた場合、そこの書式も変えましょう

座標変換スクリプトなら、全く問題にならないと思われる内容ですが、AWKで精度を
維持しようとする場合の注意点とお考え下さい


Indexへ
(977)←【979】→(991)
------------------------
【タイトル】Re(4):単精度、倍精度
【記事番号】 979 (977)
【 日時 】03/01/31 09:03
【 発言者 】三五六 ebinat@mta.biglobe.ne.jp

▼名無しさん:
>BEGIN パターンが有ると思いますので、そこで CONVFMT="%.15g" と設定すれば

CONVFMTとの使い分けをいまいちはっきり憶えられないのですが、OFMTが関係する
場合も有るようです。(printで有効なのかな?)
OFMTもCONVFMTと初期値は同じです。

私は、実数を扱うawkスクリプトでは、だいたい下記設定を使っています。
OFMT=CONVFMT="%.15g"
それと(かなり余談ですが)
出力レコードセパレータORSをNULLにして、print命令を多用します。
ORS=""

print $1,$2,$3,$4 "\n";

参考まで。

三五六


Indexへ
(979)←【991】//(969)
------------------------
【タイトル】Re(5):単精度、倍精度
【記事番号】 991 (979)
【 日時 】03/01/31 12:01
【 発言者 】牛渡

三五六さん、名無しさん、
フォローありがとうございました。 勉強になりました。