• ベストアンサー

c言語の変数の型について

浮動小数点数の変数の型ってfloat、double、long doubleがありますよね?(その他もあったら教えてください) doubleはfloatの倍精度らしいですが、倍精度ってのは扱える数字の範囲が2倍なのか有効桁が2倍なのかわからないんで教えてほしいです。ちなみに、doubleとlong doubleの違いも判りません。 あと、これらの変数はprintfで出力するときは最高で8桁までしか出力できないんでしょうか?20桁とかは無理なんですかね?

質問者が選んだベストアンサー

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

> 浮動小数点数の変数の型ってfloat、double、long doubleがありますよね?(その他もあったら教えてください) 少なくとも、float _Complex, double _Complex, long double _Complexがあります。 あと、任意実装ですが、float _Imaginary, double _Imaginary, long double _Imaginaryもあります。 ISO/IEC TR 24732では、_Decimal32, _Decimal64, _Decimal128もあります。 独自拡張まで含めれば、short double型をサポートするような処理系もあります。 > doubleはfloatの倍精度らしいですが、 そうとは限りません。 > あと、これらの変数はprintfで出力するときは最高で8桁までしか出力できないんでしょうか?20桁とかは無理なんですかね? printf("%.20g", x); のようにすれば20桁まで出力できますが、有効桁数が何桁あるかは処理系によります。

その他の回答 (2)

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.3

規格の詳細は他の人に任せるとして、よくあるIEEE754ベースの浮動小数点数では floatは32ビットで、有効数字に23ビット、指数に8ビット、符号に1ビット使います。 なお、有効数字は正規数では隠れた1を使って実質24ビットになります。 doubleは64ビットで、有効数字52+1ビット、指数11ビット、符号1ビットです。 有効数字は10進ではfloatで約7桁、doubleで約15桁です。有効数字は約2倍ですね。 指数はfloatが-127~126(10進で38桁くらい)、doubleが-1023~1022(10進で308桁くらい)です。表現範囲は8倍くらいになりますか。 long doubleのサイズは本当にマチマチですからあてになりません。doubleと同じだったり、Intel x87レジスタの80ビットサイズだったり、IEEE754四倍精度の128ビットだったり。 # Visual C++はdoubleと同じらしい。16ビット世代は80ビットだったようだが # Borland C++Builderは80ビットの様子。GCCも80ビット? # 128ビットの処理系は未確認

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

まず。Cの型の大きさは、環境に依存するところがあるので、全てに共通、というわけにはいきません。それを踏まえた上で。 > doubleはfloatの倍精度らしいですが、倍精度ってのは扱える数字の範囲が2倍なのか有効桁が2倍なのかわからないんで教えてほしいです。 32bit Windows用でよく使われる形式だと float 32bit double 64bit と内部表現のビット幅が倍です。 仮数、指数ともに使用ビット数が増えているので、有効桁、範囲は単純に倍ではありません。 ただし、規格では「doubleはfloat以上の桁」としかありません。「倍精度」と名前がついていますが、「倍」どころか「floatと同じ」であってもルール違反ではないです。 > あと、これらの変数はprintfで出力するときは最高で8桁までしか出力できないんでしょうか?20桁とかは無理なんですかね? printfのマニュアルで「書式文字列」のところをよく読んでますか?幅指定のところに小数点で精度の指定ができます。 例: %8.2f :全体で8桁以上、うち小数点以下が2桁の「f」形式 ただ、20桁指定しても有効な桁は上の方だけになりますが

関連するQ&A

  • 変数の型について

    変数の型を設定する時ですが、浮動小数点とは何ですか? doubleとfloatはどう使い分けるのですか?

    • ベストアンサー
    • Java
  • linux RedHatでC言語

    整数、単精度(float)、倍精度(double)の変数変換、各種書式付出力について教えてください。 また、よろしければ、40桁の整数、有効数字20桁の実数、小数点以下15桁の実数を表示する方法について教えてください。 本当にC言語の初歩だとは思いますが教えてください。

  • 変数について

    質問1:-0.0685274635この数値を扱うのは(計算したりIFで判断するには)どの変数を使えば良いですか? '変数 Variant Double=倍精度浮動 Currency=通貨型 Integer=整数型 Float=浮動小数点型 Long=長整数型 Dim CAL_DA As Integer Range("A1")="-0.0685274635" CAL_DA =Range("a1") 質問2:CAL_DAが-6.85274..になってしまいます。 ただし、必要とするのは-0.068の桁でよいのですが 質問3:CAL_DA =Mid(Range("a1"),1,6)いけますか? 以上ですよろしくお願いします。

  • 型指定子についての教えてください。

    コンパイラはMicrosoft visual C&C++を使用しています。 (1)型指定子のfloat,doubleの大きい数値について。 計算をするとfloatは7桁までは正しくて、7桁より大きい桁はデタラメです。doubleは15桁までは正しくて、15桁より大きい桁はデタラメです。有効数字7桁,15桁とはこういうことでしょうか。 後、floatは有効数字7桁、doubleは有効数字15桁で本当に正しいのでしょうか。 (2)型指定子のfloat,doubleの小数点以下の数字について。 floatは10^-38まで、doubleは10^-308までの数字を扱えると参考書には書いてありますが、計算をしますと小数点以下6桁までは求まりますが、それ以下は求まりまりません。それ以下の数値はすべて0になります。なぜでしょうか。 (3)int,long intとdouble long doubleの違いについて。 intとlong intはともに-2147483648~2147483647までの範囲だと思います。またdoubleとlong doubleはともに有効数字15桁でした。何か違いがあるのでしょうか?

  • データ型について

    VBに限ったことではないのですが、 データ型には、短整数型、整数型、長整数型、単精度浮動小数点数型、倍精度浮動小数点数型といろいろな型がありますが、 整数を扱うなら長整数型、小数も含めて扱うなら倍精度浮動小数点数型 を使えば良いと思うのですが、それにより桁数の小さな短整数型、整数型とかは何のためにあるのでしょうか? あまり大きな値を扱わないときにそちらの型を選ぶメリットは何なのでしょうか?

  • C言語イプシロン値

    現在使用中の開発環境(C言語使用)標準ヘッダfloat.hに単精度浮動小数点数イプシロン値が下記のように定義されています。 #define  FLT_EPSILON   0x8p-26F 「0x8p-26F」なる表現を初めて見たのですが、これはどういう意味で、具体的にどんな数字になるのでしょう? ご存じの方、教えてくださいませ。 よろしくお願いします。

  • double型からfloat型への型変換について

    double型で-999.999という数字をfloat型へキャストして 少数以下6桁をprintf文で表示すると、それぞれ以下の様になりました。 double -999.999000 float -999.999023 これは、単純にfloatの精度の問題なのでしょうか? また、計算機がどういうルールに基づいて計算をおこなっているということなのでしょうか? 教えてください。

  • C++でのdouble型データの精度

    こんにちは。 コンパイラは、Borland C++ Compiler 5.5 を使っています。 表題の「精度」とは、 正確な値が保証される、「整数部分の桁数」+「小数点以下の桁数」 の事です。 普通、double型データの「精度」は、16桁であると認識しています。 そのため、例えば、 a=123456789012345.6 という浮動小数点数は16桁なので、正しい値が保証されるはずです。 ところが、printf("%f", d1); のようにprintf関数で表示すると、 123456789012345.593800 と表示されました。 これは、d1が正しい値を保持できていないという事です そこで、桁数を下げていった所、 a=1234567890.1 つまり、精度は11桁しかないという事になります。 何か僕が勘違いしているのでしょうか? それとも、僕が使っているコンパイラの精度が11桁しかないという事なのでしょうか? 何かお分かりの方がいらっしゃれば、是非アドバイスを頂きたいと思います。 では、よろしくお願い致します。

  • 浮動小数点数型

    単精度浮動小数点型と倍精度浮動小数点数型、それぞれ値がとりうる範囲を教えてください。 単精度浮動小数点型 負の値は -3.4028235E+38 ~ -1.401298E-45、 正の値は 1.401298E-45 ~ 3.4028235E+38 の範囲の値 倍精度浮動小数点数型 負の値は -1.79769313486231570E+308 ~ -4.94065645841246544E-324、 正の値は 4.94065645841246544E-324 ~ 1.79769313486231570E+308 の範囲の値 とは記述してあるのですが、実際に小数1桁なら整数部はどのくらいの範囲の値がとれるのか、皆目わかりません。 どうか、わかりやすく教えてください。 よろしくお願い致します。

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

    あるプログラムの処理を高速化するために浮動小数点数を固定小数点数に変換したいので、皆様の力を貸してください。 以下のようなプログラムがあります。 ------------------------------------------------------------- #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でお願いします。

専門家に質問してみよう