c/c++で文字列変換無しで小数点以下の桁数が求めたい

投稿者: Anonymous

c/c++で文字列への変換無しで小数点以下の桁数を求めたいです。
e.g)
1.0 -> 0
1.1 -> 1
0.001 -> 3

float x= 0.4002;
int i=0;
while( x != floor(x) )
{
  x*=10;
  ++i;
}

一応こんな方法は思いついたのですが、
浮動小数だと正確に10倍されずに正しい桁数が出ないことが判明したので 正確に小数点以下の桁数を求める方法があれば教えてください。

解決

浮動小数だと正確に10倍されずに正しい桁数が出ない

そこまで理解されていればもう少しです。正確に10倍できないのと同じように 0.1 は正確には 0.9999999999… を適当なところで四捨五入して 0.1000000000 とみなして扱っているに過ぎません。
また有効精度は10進数で8桁程度であり、例えば1億辺りの値を扱うと1の位に誤差が現れ小数点以下の値は保持できなくなります。

以上を踏まえて、誤差をどこまで許容するかの問題でしかありません。


後は x*=10; のように演算を繰り返すと誤差が積算されていくため、x * 100x * 1000のようになるべく整数演算を行い、浮動小数点数の演算を1回で完了させることで誤差を抑えることができます。

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *