HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0401
ななしのごんべ実数の扱い3解決


ななしのごんべ

リンク

2010/4/1(Thu) 23:43:32|NO.31737

zさんの質問を眺めていて疑問に思いました。
1.strf命令によって変数値を表示させる場合、書式の指定によって
表示が異なるのはなぜか?

2.下記のように、変数を計算させた場合、"+0.00"ではなく
"-0.00"になるのはなぜか?

1.については、まあ、Cランタイムの仕様なのかもと思うのですが
2.については、ちょっと違和感があります。
両者とも、Cランタイムの仕様なのでしょうか?


a=0.0 a+=0.01 a+=0.01 a+=0.01 mes "a="+strf("10進実数桁数指定付き[%0.16f]",a) mes "a="+strf("[sign]dd[d] 形式の符号付きの実数値[%0.16e]",a) mes"" mes "a="+strf("10進実数桁数指定付き[%0.8f]",a) mes "a="+strf("[sign]dd[d] 形式の符号付きの実数値[%0.8e]",a) mes "" a-=0.01 a-=0.01 a-=0.01 mes "a="+strf("10進実数桁数指定付き[%0.16f]",a) mes "a="+strf("[sign]dd[d] 形式の符号付きの実数値[%0.16e]",a) mes"" mes "a="+strf("10進実数桁数指定付き[%0.8f]",a) mes "a="+strf("[sign]dd[d] 形式の符号付きの実数値[%0.8e]",a) mes "" stop



この記事に返信する


ANTARES

リンク

2010/4/2(Fri) 03:00:22|NO.31738

>1.strf命令によって変数値を表示させる場合、書式の指定によって
>表示が異なるのはなぜか?
 表示形式のことを言っているのなら、それがeとfの仕様です。
値が異なることを言っているのなら、桁数が小さいからです。
桁数が小さいとなぜ異なるのかと言うならeの場合は値が丸められるからです。
http://www.bohyoh.com/CandCPP/C/Library/fprintf.html
の「(e) 変換指定子」の「e」と「f」のところを見てください。

>2.下記のように、変数を計算させた場合、"+0.00"ではなく
>"-0.00"になるのはなぜか?
 値を丸める前の値が負か負でないかによります。



ANTARES

リンク

2010/4/2(Fri) 03:21:59|NO.31739

 これらの違いがなぜ起こるのかというと、
0.01は有限桁の2進数では正しく表現できないため、
誤差が発生するからです。
1/3が有限桁の10進小数では正しく表現できないのと同じことです。



ななしのごんべ

リンク

2010/4/2(Fri) 23:55:24|NO.31752

どうもありがとう



ONION software Copyright 1997-2023(c) All rights reserved.