![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
お世話になっています。
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
No.2ベストアンサー
- 回答日時:
★プログラムの問題点はありません。
・ただ、『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』です。
・以上。おわり。
No.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);
}
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_14.png?8acaa2e)
No.1
- 回答日時:
float型で保持できる有効桁数は10進数で約7桁までです。
従って、53.19660 迄がぎりぎりの値です。それ以上の制度は保証できません。参考URLを参照ください。
参考URL:http://www.kyoto-su.ac.jp/~yamada/programming/fl …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C言語: ポインタ 5 2022/06/01 08:33
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
C++で外積
-
至急です! マクロ定義で #defi...
-
先程の質問で教えていただき、...
-
C言語
-
C言語を実行すると-infが出てき...
-
(C言語)ニュートン法のプログ...
-
Cで3乗根を求める方法
-
C言語 関数プロトタイプ宣言の...
-
float型とdouble型の変数の違い...
-
C#、太らせた多角形を塗りつぶ...
-
はさみうち法のプログラム(C言...
-
-1.#IND00と出てしまうのですが...
-
数値を指数部と仮数部に分離したい
-
2つの式
-
1以上の自然数を2つ(それぞれ...
-
急!【ヒストグラムのプログラ...
-
C言語でのsinxのマクローリン展...
-
vc++expreeで作ったdllをvbaで使用
-
3次方程式の求解プログラム(...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
doubleの変数にintとintの割り...
-
float型とdouble型の変数の違い...
-
c言語で、繰り返し文の中で、0....
-
C言語を実行すると-infが出てき...
-
C言語 関数プロトタイプ宣言の...
-
C 開放してるのにエラー(doubl...
-
C言語の型による処理速度の違い
-
至急です! マクロ定義で #defi...
-
関数におけるif文とreturn文に...
-
c言語のプログラミングについて...
-
2分法で方程式の複数の解を自...
-
-1.#IND00と出てしまうのですが...
-
doubleは常に%lfとするべきなのか
-
C言語のpow関数の不具合
-
C言語で-23乗を取り扱うには
-
C言語で台形公式を使った二重積...
-
Cで3乗根を求める方法
-
2次方程式の解を求めるプログ...
-
sin(x)の近似について
おすすめ情報