C言語のデータ型について教えてください

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
telepas7

C言語のデータ型について教えてください

#1

投稿記事 by telepas7 » 10年前

----------------------------------------------------------------------------------------------------------

例えば、char型の最大値は127、最小値は-128です。
そこで、unsigned double 型の最大値と最小値を教えてください。

また、プログラミングする上でデータ型を知っておくメリット教えてください。
----------------------------------------------------------------------------------------------------------

大学で簡単なシステムをいくつか組みましたが、正直、データ型による恩恵を大して感じませんでした。
しかも、floatやdoubleは精度実数型(?)といい、とてもややこしく感じます。
プログラミングに手慣れた人から見れば呆れる内容かもしれませんが、どうか説得力のある説明をお願いします!

宜しくお願いします<(_ _)>

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: C言語のデータ型について教えてください

#2

投稿記事 by みけCAT » 10年前

telepas7 さんが書きました:
例えば、char型の最大値は127、最小値は-128です。
そこで、unsigned double 型の最大値と最小値を教えてください。
C99にunsigned double型はなさそうです。(規格書を持っていないので厳密にはわかりませんが)
http://ideone.com/umFdsZ
もしtelepas7さんが使用しているコンパイラの独自拡張だとしたら、limits.hまたはfloat.hをインクルードし、
定数UDBL_MINおよびUDBL_MAXを参照すればわかるかもしれません。
telepas7 さんが書きました:
また、プログラミングする上でデータ型を知っておくメリット教えてください。
データ型の特徴(主に入る値の範囲とメモリ上のサイズ)を知っておくことにより、
使用する値の範囲に合わせた適切なデータ型を使用することでメモリを節約することができます。(これは一例です)
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: C言語のデータ型について教えてください

#3

投稿記事 by みけCAT » 10年前

telepas7 さんが書きました:例えば、char型の最大値は127、最小値は-128です。
ちなみにこれは環境依存です。char型が符号なしの環境もあります。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: C言語のデータ型について教えてください

#4

投稿記事 by softya(ソフト屋) » 10年前

① unsigned double 型は私の知る限り存在しません。

② float/doubleは精度が違うので少有効桁を知っていないと手痛い失敗をします。
あとfloat/doubleとint/short/charは根本的にデータの持ち方が違うので相互の変換で誤差を生じます。
知らないと計算誤差を、そのまま使ってしまうでしょう。

int/short/charも有効桁を超えるとオーバーフローして予想外の値に化けます。
これも知らないとバグを生み出す原因となります。

>しかも、floatやdoubleは精度実数型(?)といい、とてもややこしく感じます。

これは計算速度と扱える桁数、使用するメモリ量のバランスをとても考えられた規格です。
コンピュータの都合に人間を合わせてくださいと言うことです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: C言語のデータ型について教えてください

#5

投稿記事 by ISLe » 10年前

float/doubleの最大値・最小値もC/C++では処理系依存ですよね。
IEEE 754がデファクトスタンダードですが。

プログラミングする上では型と同時に型変換についても知っておく必要があると思います。

telepas7

Re: C言語のデータ型について教えてください

#6

投稿記事 by telepas7 » 10年前

------------------------------------------------------------------------------------------------------
たくさんの回答ありがとうございます。皆さんのアドバイスのおかげで分かったことは、
・プログラム内の数値の大小に適したサイズ感のデータ型を選択することで無駄の無いプログラムが組めるということ
・データ型にsignedとunsignedを付ければ、負の有効範囲を削って正の有効範囲を広げるなどと無駄のないプログラムを組むことに一躍買うということ
という上記の2点です。
------------------------------------------------------------------------------------------------------

まだ理解の浅いところとして、以下に示す回答の「メモリ上のサイズ」、「根本的にデータの持ち方が違う」という点があります。
追加でご教授して頂けると助かります。

>>データ型の特徴(主に入る値の範囲とメモリ上のサイズ)を知っておくことにより、
使用する値の範囲に合わせた適切なデータ型を使用することでメモリを節約することができます。
>>float/doubleとint/short/charは根本的にデータの持ち方が違うので相互の変換で誤差を生じます。
知らないと計算誤差を、そのまま使ってしまうでしょう。


あと、もう1点だけ質問です。
いろいろと調べているうちに、double型とfloat型の意味が余計に分からなくなってしまいました。結局のところ有効範囲はよく分からないですし、バイトとかビットとかeとかがどのように関係しているのかもよく分かりません。
調べた内容を以下に示すので、これらの意味を自分のレベルでも分かるように噛み砕いて説明してください。
本当に私の理解力が低くて申し訳ないです....汗 宜しくお願いします<(_ _)>

『C言語入門』では、「1000.0 ÷ 1.125 = 888.88888888888888・・・・・・・・のとき、
float型の場合、888.88891601562500000000で有効精度が6桁となり、double型の場合、888.88888888888891000000で有効精度が15桁となります。」
とか、「float型は最小値:1.175494351e-38F最大値3.402823466e+38F、
double型は最小値:2.2250738585072014e-308最大値:1.7976931348623158e+308です。」などと書いてあります。

とあるサイトでは、「float⇒32ビット単精度浮動小数点数、double⇒64ビット倍精度浮動小数点数」と書いてあります。

また、別のサイトでは、「floatはサイズが4バイトで値の範囲が3.4E-38 ~ 3.4E+38、doubleはサイズが8バイトで値の範囲が1.7E-308 ~ 1.7E+308」と書いてあります。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: C言語のデータ型について教えてください

#7

投稿記事 by softya(ソフト屋) » 10年前

・データ型にsignedとunsignedを付ければ、負の有効範囲を削って正の有効範囲を広げるなどと無駄のないプログラムを組むことに一躍買うということ

これは整数型にしか通用しません。浮動小数点型には既に書いたとおりunsingedが無いためです。

① これはwikipediaにも書いてあるので、それを見た上でわからないことを聞いてください。

「整数型 - Wikipedia」
http://ja.wikipedia.org/wiki/%E6%95%B4% ... 0%E5%9E%8B

② 浮動小数点型(float/double)

これは、扱える値の範囲を大きく取り、かつデータサイズをコンパクトに収める非常にうまい方法です。
ただ、特殊なのでちゃんと知らないと計算誤差を出しまくります。

コンピュータ内部では2進法なのですが、ややこしくなるので10進法で説明しましょう。
浮動小数点では、すべての数値は1桁以下の少数のある数値(仮数部)にべき乗数(指数部)をかけて表現します。
例えば、11は1.1x10です。
この時の1.1と言う表現における有効桁が精度となります。
精度の6桁まで保証と言うのは0.00001より小さい値は誤差で信頼に値しないと言うことです。
それとべき乗数が数値の大きさの範囲を決めます。ミクロの世界から、あるていどの宇宙の広さまでfloat/doubleは扱うことが可能です。
例えば2.11 x 10の7乗は、2.11万キロメーターを表すことも出来るわけで逆に2.11 x 10の-3乗は2.11mmですね。

なお、2進法と10進法の変換で2進法の少数と10進の少数は誤差を生み出すので表示するだけや入力時点で誤差を生じさせています。
詳しくは2進⇔10進の変換を学んでください。

【補足】
バイトやビットは一般的なPCに限定して考えれば難しく考える必要がありません。
1バイトは8ビットです。floatは4バイトでdoubleは8バイトです。
バイト数にビット数を掛ければビット長が求められます。算数の範囲ですよね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

“C言語何でも質問掲示板” へ戻る