電子書籍の厳選無料作品が豊富!

お世話になっています。
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

A 回答 (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』です。
・以上。おわり。
    • good
    • 1

無理やりな感じですが、


以下の様なコードでは如何でしょうか?

#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);

}
    • good
    • 0

float型で保持できる有効桁数は10進数で約7桁までです。


従って、53.19660 迄がぎりぎりの値です。それ以上の制度は保証できません。参考URLを参照ください。

参考URL:http://www.kyoto-su.ac.jp/~yamada/programming/fl …
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!