- ベストアンサー
文字列をfloatで読み込む(atoi,sscanf)。しかし、値がおかしい。
お世話になっています。 C言語の質問です。 文字列をfloatで読み込もうとしているのですが、出力結果がおかしくて困っています。 文字列をatofで変換した場合、doubleでは上手く表示できるのですが、floatでは少数が上手く表示できません。 また、sscanfでも試したのですが、上手く表示できませんでした。 どうしても、doubleを使わずにfloatであらわしたいと考えています。 どうかこのプログラムの問題点のご指摘お願いします。 実行結果 53.196600 53.196602 53.196602 ソース #include<stdio.h> #include<stdlib.h> #include<string.h> main() { char str[100]="53.1966"; double b; float c,d; b = atof(str); printf("%f\n",b); c = (float)atof(str); printf("%f\n",c); sscanf(str,"%f",&d); printf("%f\n",d); } 開発環境 windowsXP cygwin
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
★プログラムの問題点はありません。 ・ただ、『float』型は『double』型よりも精度が悪いです。 ・よって『float f=53.1966F;』と値をセットしても『printf("%f\n",f);』とすると 『53.196602』となります。→この誤差が『float』型の精度の限界です。 ・通常、『double』型でも誤差が出るため『float』型ではもっと誤差が大きくなります。 参考: void main( void ) { float a = 1.0000000F; float b = 1.2345678F; float c = 53.196600F; double aa = 1.0000000; double bb = 1.2345678; double cc = 53.196600; printf( "a = %.20f\n", a ); printf( "b = %.20f\n", b ); printf( "c = %.20f\n", c ); printf( "aa = %.20f\n", aa ); printf( "bb = %.20f\n", bb ); printf( "cc = %.20f\n", cc ); } 実行結果: a = 1.00000000000000000000 b = 1.23456776142120360000 c = 53.19660186767578100000 aa = 1.00000000000000000000 bb = 1.23456780000000000000 cc = 53.19659999999999700000 最後に: ・どうしても『double』型を使わずに『float』型で表したいならば、誤差を覚悟してね。 ・私の環境では、b=『53.196600』、c=『53.196600』、d=『53.196602』でした。 ・使用言語は『Microsoft Visual Studio.NET 2003』です。 ・使用 OS は『WindowsXP SP2 Home』です。 ・以上。おわり。
その他の回答 (2)
- arebako
- ベストアンサー率33% (1/3)
無理やりな感じですが、 以下の様なコードでは如何でしょうか? #include <iostream> #include <math.h> main() { char str[100]="53.1966"; char *p; int n; float c; p = strrchr(str,'.'); if(p != NULL){ n = (int)pow(10,(int)strlen(p)-1); }else{ n = 1; } c = (float)(atof(str)*n); printf("%f\n",c/n); }
- tatsu99
- ベストアンサー率52% (391/751)
float型で保持できる有効桁数は10進数で約7桁までです。 従って、53.19660 迄がぎりぎりの値です。それ以上の制度は保証できません。参考URLを参照ください。