アプリ版:「スタンプのみでお礼する」機能のリリースについて

最近、ふと『浮動小数点』について疑問を持ちました。
それは『浮動小数点』がどんな場合に役立つのか?という事です。
C言語では標準で『float』型と『double』型がありますよね。
私は昔、C言語を始めたころにテスト・プログラムなどで使った経験しかなく
その後に『電卓ソフト』を作ろうとしたときに『誤差』が原因で役に立たない
ことを知りました。『誤差』があることは知っていましたが…。

そこで質問。内容は『浮動小数点』はどんな場面で利用されているかです。
実際の『ソフトウェア開発』や趣味でフリーソフトを作った場合も含み、あと
こんな場面で役に立つのではという事を知りたいのです。
アンケートみたいになりますが、『アンケート』カテゴリでは、あまり回答などが
集まらないと思い『C/C++』カテゴリのこちらで質問としました。

よろしくお願いします。

A 回答 (6件)

#4です。



> 『科学技術計算』などでも、多少の計算誤差は問題しないでもよいのですね。

たとえば実験データの解析とかだと、元々の測定値がかなり誤差を含んでいますので、それに比べれば計算誤差は微々たるものです。それに、物理学上の計算なんかは、必ず有効数字何桁という表し方になりますから、double型の精度があれば普通は事足ります。

> 最後に『long double』型もあるのは知っていましたが、標準でサポートされたのですか。
> やはり C99 規格からですね。

C89から(つまり初めから)です。
    • good
    • 0
この回答へのお礼

再回答有り難うございます。
実験データの解析では、測定値の段階で『誤差』が既に含まれているものなのですか。
それで『浮動小数点』の計算誤差は特に気にする必要性がないのですね。分かりました。

『long double』型は 1989 年には標準でサポートされていた!ということは、ずっと
『long double』型が使えなかったのは処理系が 10 年以上もサポートしていなかったという
事ですね。私が C 言語を始めたのが 1993 年で『long double』型が処理系によっては
拡張されて存在しているものだと思いました。そして C99 で標準サポートとなったと
思ってしまいしました。2度の回答、どうも有り難うございました。

お礼日時:2007/03/15 02:15

エクセルもデフォルトは浮動小数点ですよね。


double型であれば有効桁数が15桁ほどもてるので
技術計算も9割はこれで事たります。
(有効桁数が足りない場合は多倍長演算等を使い工夫します。)
他にもゲームの3D演算、座標値やマトリックス値等も浮動小数点で持つのが普通です。

現在のCPUのほとんどは浮動小数点に対する専用の命令を持っていて
整数演算とほとんど速度的な差がありません。
多分0.0001fを10000回足して1.0000fにならなかったのでそういう疑問を持ったのかと思います。
整数をビットで区切る固定小数点という方法で持てばこの誤差は無くなるでしょうが
その代わり割り算や掛け算が面倒になる上、小数点が固定され汎用的に使えなくなります。
固定小数点でもっても乗除の時点で誤差は発生します。
それに円周率等の無理数はどうやっても誤差のない数値で持つ事はできません。
より数学的にπ等を使って計算すれば誤差はでませんが、実際には
40.05mmとか具体的な数値が必要になる事がほとんどですので
この浮動小数点で大体の需要は満たしているのです。

>その後に『電卓ソフト』を作ろうとしたときに『誤差』が原因で役に立たない
世にある電卓及び電卓ソフトのほとんどは誤差がでると思います。
(有効桁数がある事を頭の片隅にいれておけば問題はないと思います。)
    • good
    • 0
この回答へのお礼

回答有り難うございます。
最近は 3D ゲームの処理が浮動小数点を使っても速度面で問題がない時代なのですよね。
昔は CPU の処理速度が 25MB ぐらいで『円』を描画するときは三角関数などを使わずに
『加算』と『減算』を使って行うのが高速描画の常識でしたね。→楕円も。
今は標準で CPU に『浮動小数点プロセッサ』があるようですね。最初に買ったパソコンは
エプソン機(486)で『浮動小数点プロセッサ』は自分でつけるしかありませんでした。バグもあったらしい。
固定小数点で電卓を作ったときは、かなり面倒になりました。その後に『多倍長実数演算』の
ライブラリを作成して桁数を上げることで精度を上げました。電卓の有効表示桁数は 16 桁で
内部の演算は 20 桁にしました。電卓の誤差修正はどんなアルゴリズムで行っているのでしょうね。
もしも、知っていれば再回答をお願いしたいです。

お礼日時:2007/03/15 00:40

科学技術計算分野(現在でもFortranが使われることも多いですが)などでは浮動小数点は重要ですね。

あと、3Dの座標計算なんかでも浮動小数点数は必須です。こういった分野では、多少の計算誤差はほとんど問題になりません。これがお金の計算なんかだと、本来は整数で扱うべきものですし、1円違っても大変なので、浮動小数点数は概算以外には使えないでしょうね。

あと、

> C言語では標準で『float』型と『double』型がありますよね。

long double型も標準でサポートされています。
    • good
    • 0
この回答へのお礼

回答有り難うございます。
『Fortran』言語は科学技術計算に向いている言語だと聞いた事がありましたが、
C言語ではあまり聞いた事がなかったので『浮動小数点』の必要性に疑問を感じました。
『科学技術計算』などでも、多少の計算誤差は問題しないでもよいのですね。
最後に『long double』型もあるのは知っていましたが、標準でサポートされたのですか。
やはり C99 規格からですね。→C99 はあまり詳しくないです。ネットでよいサイトを
発見しましたがまだ読んでいません。今度、じっくりと読んでみます。
ちなみに今使っている処理系では『long long』型も『long double』型も使えない環境です。
残念です。試せなくて。

お礼日時:2007/03/15 00:27

・数値解析


・実験の測定結果、および、その誤差の計算
とか。
    • good
    • 0
この回答へのお礼

回答有り難うございます。
『数値解析』や『実験』などの用途は思いつきませんでした。
そうですね。パソコンは電子計算機ですから『数値解析』などにはいい使い方ですね。
実験では小数点以下も重要になりますから『浮動小数点』の必要性を私が知らなかっただけですね。
とてもよい回答です。参考になりました。

お礼日時:2007/03/15 00:17

ソフトウェアはかじった程度のもので、回答になっていませんが。



> 『誤差』が原因で役に立たないことを知りました。

役に立つ立たないは用途にも寄るので肯定も否定もしませんが、
どんな場合にも誤差ゼロで計算を行う方法があるのなら教えて頂きたいです。
浮動小数点での演算は有効桁数を超える時と10進数に変換表示する時に
誤差が出るのは
方式上止むをえませんが、この範囲内なら誤差はゼロですよ。

それはポケコンでよくあった、10進演算っていうんでしたっけ、
それと基本的に同じことで、そちらは10進数への変換誤差がないだけのことです。

浮動小数点での演算は高速なので多桁・多項の化学計算には有用だと
聞いた気がします。
    • good
    • 0
この回答へのお礼

回答有り難うございます。
たしかに saru_1234 さんのアドバイスどおりに用途によりますね。
昔、電卓を作ろうとしたときに入力したキーを数値化して管理する方式を取りました。
すると小数点の場合は『入力』しているだけでも『値』が狂うのです。→当然ですが…。
最終的には文字列で入力を管理して『double』型を指数の仮数部で扱い、指数変数を
用意して演算させました。その後に『多倍長実数演算』のライブラリを作成して差し替えました。
ポケコンでは10進演算があるのですか。十進 BASIC というフリーソフトは知っていましたが…。
科学計算には有用ですね。math ライブラリに算術関数があり、C99 の規格では『虚数』も扱える
関数が増えましたし、目的によりますね。役に立つかどうかは。
有り難うございました。

お礼日時:2007/03/15 00:13

浮動小数点は、固定小数点と比較して、表すことが出来る数値の


範囲が広いですね。

例えば、1億円くらいの買い物をして、1円の単位までは多分必要
ないでしょう。百万円単位くらいで切り上げや切捨てをすると思い
ます。固定小数点は常に1円まで表現するので、表現の上限と下限が
狭くなります。浮動小数点は、必要な精度、先ほどの1億円で百万円
単位にしたら制度は3桁でいい訳ですので、数値の上限と下限の範囲
が広がるわけです。

まあ、極端な例ですが、考え方です。
    • good
    • 0
この回答へのお礼

素早い、回答有り難うございます。
表現上の考え方ですか。
たしかに浮動小数点の方が表現できる範囲が広いですし、1円単位での
処理は場合によっては必要なくなりますね。

出来たら『小数値』の必要性の意見がお聞きしたかったです。
質問不足でしたが参考になります。

お礼日時:2007/03/15 00:01

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