浮動小数点floatからStrへの変換をgcvt関数で行なうときに、値が小さいと文字列0.00005が欲しいのに5e-05になってしまいます。
どうすればよいですか?教えてください。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

私はgcvtという関数を知りませんが、名前と結果から想像するに、


  sprintf( str, "%1.g", f );
ということをしているのではないでしょうか。
(f に 0.00005 を代入して実行すると、str は "5e-05" になります。)

printf 系の関数で変換文字に "g" または "G" を指定すると、
・指数部が -5 以下か、有効精度以上のときは、e または E 変換を行い、
・それ以外のときは、f 変換を行います。
※ f 変換は「0.00005」のような小数形式に、g/G 変換は「5e-05(または5E-05)」のような指数形式になります。

素直に f 指定の sprintf 関数を使うか、お手持ちのライブラリから「fcvt」という名前の関数を探すかしてみて下さい。(多分こんな名前になっていると思う。)
    • good
    • 0
この回答へのお礼

回答ありがとうございましたm(__)m
なんとかかんとか解決することが出来ました。ありがとうございます。

お礼日時:2001/12/18 19:00

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q小数点つきの数値を文字列として読み込み、浮動小数点数値として出力

タイトルの通りです。
小数点以下は6桁までです。
ヒントでいいんで教えてもらえるとありがたいです。
よろしくおねがいします。

Aベストアンサー

入力の方は回答が出てるようなので、
出力の方を。

小数点以下を6桁にしたいんですよね。
printfで%.6fとかやるといいと思います。
ご存じかもしれませんが、
ファイルに出したいならfprintf、
文字列にしたいだけならsprintf、
です。

Q小数点入りの文字列をfloat型に変換

例えば、 32.1 のように4文字の文字列が、あるchar型配列に入っている場合、この値を使って計算したいので、float型などに変換したいのですが、どんな方法がありますか?

Aベストアンサー

「float型など」の「など」に何が含まれるかが分かりませんが、float型であれば以下の方法が考えられます。

char str[] = "32.1";
char *endptr;
float x;

/* 以下の3種類のどれか */
x = atof(str);
x = strtod(str, &endptr);
sscanf(str, "%f", &x);

また、C99対応の処理系であれば、strtof関数が使えますし、C++であれば、std::stringstreamを生成して、>>演算子を使う方法もあります。

Q浮動小数点演算を固定小数点演算へ変換する

あるプログラムの処理を高速化するために浮動小数点数を固定小数点数に変換したいので、皆様の力を貸してください。

以下のようなプログラムがあります。
-------------------------------------------------------------
#define A 0.105

int main(){
double y;
double a,b;
double t1,t2

t1 = A * a;
t2 = t1 * t1;
y = t2 * b;
printf("y = %lf\n",y);
return 0;
}
-------------------------------------------------------------
a,bが入力でそれぞれ0~6000,0~0.004の値を取ることが分かっています。また、yは出力であり許容誤差は3以下となっています。

上記のプログラムを固定小数点数で記述しなおすとどのようになりますか。
各変数の型はshortでお願いします。

あるプログラムの処理を高速化するために浮動小数点数を固定小数点数に変換したいので、皆様の力を貸してください。

以下のようなプログラムがあります。
-------------------------------------------------------------
#define A 0.105

int main(){
double y;
double a,b;
double t1,t2

t1 = A * a;
t2 = t1 * t1;
y = t2 * b;
printf("y = %lf\n",y);
return 0;
}
-------------------------------------------------------------
a,bが入力でそれぞれ0~6000,0~0.00...続きを読む

Aベストアンサー

結論から言うと、16ビット整数型演算の範囲ではご希望の「許容誤差は3以下」は実現できないのではないかと思います。
というのは、kを適当な係数として、途中でどうしても (ka)^2 の計算をせざるを得ないからです。(ka)^2 を16ビット整数の範囲に収めるには、符号なしとしてもkaの値は0~255の整数である必要があります。kaの値が256通りしか取れないので、a=5977の場合とa=6000の場合を区別できなくなります。b=0.004のとき、浮動小数点演算のまま本来の値を計算すると
* a=5977 ならば y=1575.45…
* a=6000 ならば y=1587.6
ですから、この2つの場合の結果が同じ値になってしまうということは誤差が3を越えるということです。

ところで、bの値の有効桁数は?
また、結果が負になることはないはずなのに「符号はありで」と書かれているのはどうしてでしょうか?

Q浮動小数点の小数点3桁を。。。

宜しくお願いします。C言語を使い三角関数の計算を行っております。小数点3位以下は四捨五入にしたいのですが、そのような関数が有りますでしょうか?
環境はQuickC(MSDOS)です。
もしなければ文字列にでも変換し直して行うのでしょうか?一般的な方法など御在ましたらお教え下さい。
宜しくお願いします。

Aベストアンサー

負の数の対応は必要ですか?
負の場合の四捨五入の定義は「絶対値の四捨五入に符号を付加」でいいですか?

「絶対値の四捨五入に符号を付加」でオッケーなら、#1,#2,#3の回答に符号処理の処理を加えてください。

Qif(str=='a' || str=='b' || str=='c')これまとめられませんか?

題名どおりなんですが短縮してかけませんか?

Aベストアンサー

Perlなどではこういうのは正規表現で
if ( str =~ /(a|b|c)/ )

なんていうように書けます.
C言語でも正規表現を使うためのライブラリはある
(正規表現,C言語などのキーワードで検索して探してください)
ので,それを探して使うのもありかもしれません.


人気Q&Aランキング

おすすめ情報