
No.3ベストアンサー
- 回答日時:
「0.1」というリテラルはdouble型になります。
そして、float と double の値を比較するときは、float 値がdouble に変換されてから、double同士の比較として処理されます。
つまり、「f==0.1」は、
「0.1 をfloatで表現したものをdoubleに変換したもの」と「0.1をdoubleで表現したもの」の比較を行います。
そのため、float の精度の低さから、等しくないという結果になります。
参考:IEEE754(一般的な浮動小数点数)表現だと、
float : 指数部8bit/仮数部24bit
(float)0.1 = 1.10011001100110011001101b ×2^-4
double : 指数部11bit/仮数部53bit
(double)0.1 = 1.1001100110011001100110011001100110011001100110011010b ×2^-4
ですので、「f==0.1」という比較の場合、(float)0.1 はdouble に変換され、
1.10011001100110011001101 00000000000000000000000000000×2^-4
1.10011001100110011001100 11001100110011001100110011010×2^-4
の比較になります。
なお、比較を「f==0.1f」にすれば、float 同士の比較ですので、等しいという結果になります。
ありがとうございました。
0.1 というリテラルそのものが、double の型を持っているとは気づきませんでした。
なんとなく、 f == 0.1 という比較で、f の型に合わせて 0.1 を変換して、比較してくれるような気がしていました。
> なお、比較を「f==0.1f」にすれば、float 同士の比較ですので、等しいという結果になります。
とのことで、そう言われて改めて、確認したら、f というサフィックスが確かにあります。
そういうわけだったのですね。
(実際に確認したら、確かに、「同じ」という結果になりました)
よくわかりました。
No.4
- 回答日時:
横から失礼します。
floatとdoubleの0.1が同じ値でないことは、#2様のご指摘から明らかかと思います。
質問者様のソースでは、最初に「float f = 0.1;」でdouble型の0.1をfloatに
切り詰めているのですが、そこはご理解しておられるでしょうか?
ソース中の「if (f == 0.1)」は、実際には「if ((double)f == 0.1)」
とfが拡張されます。
一度切り詰めたfがここで拡張されるのですから、一部情報が欠損し
double表現時の0.1とは異なる値になるため、等しくありません。
例えば
if (f == 0.1f)
と書くと等しくなるんですが、ご理解の手がかりになれば幸いです。
No.2
- 回答日時:
この回答への補足
確かに浮動小数点では、2進数展開したときの打ち切り誤差が出てきますので、それを、繰り返したしたり引いたりすると、誤差の蓄積は発生すると思います。
しかし、今回のように、単に代入して、同じ数値で比較しただけで、比較に失敗するのは不思議な気がするのですが。
No.1
- 回答日時:
その処理系では「float の 0.1」と「double の 0.1」が違う, ということでしょう.
「0.1」が正確に表現できないことがある, ということは理解できていますか?
この回答への補足
ありがとうございます。
確かに、float と double のサイズは違います(細かく調べていませんが、仮数の桁数もきっと違います)
あと、0.1 は、内部では2進数に展開されるので、無限小数を仮数の桁数で打ち切ることになります。
そうすると、float f = 0.1; と、double f = 0.1; の時で、f の中身は確かに、異なると思います。
それでも、それぞれ、0.1 としての意味のあるデータが格納されていて、これと、0.1 を改めて比較する訳なので、比較は成功するような気がするのですが。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C++初心者です stirng 2 2022/09/20 20:43
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# #include <stdio.h>int main(void) { int buf[100] = 6 2022/11/01 22:45
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- 英語 "beside"と比較級の共起の可否について 5 2022/11/15 09:51
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/01/23 11:02
- Visual Basic(VBA) ExcelVBAでDo Until loopのネスト、IF文を使って一致する物と一致しない物としたい 11 2022/12/24 17:46
- その他(Microsoft Office) ワードのマクロについて教えてください。 1 2023/01/21 16:01
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/01/23 09:24
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
.NET 小数点以下の切り捨てにつ...
-
プログラムでの数字につく”f”の...
-
このプログラムを添削してください
-
C言語で内積、、、わかりません。
-
C言語でポインタを用いた平均,...
-
C 開放してるのにエラー(doubl...
-
複利の利率を求めるプログラム...
-
get_sqr()という関数について
-
型変換??
-
実数型の変数に値を入力した計...
-
2分法で方程式の複数の解を自...
-
c言語でDFTのプログラムを作成...
-
プログラミングについて
-
「Aに対するBの割合」と「Aに対...
-
信頼区間の1.96や1.65ってどこ...
-
有効数字について 以前質問をし...
-
Fortran において変数の定義
-
memcpyについて
-
C++の課題が分かりません。
-
Unicode でのWin32アプリのプロ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
float型とdouble型の変数の違い...
-
C言語を実行すると-infが出てき...
-
C 開放してるのにエラー(doubl...
-
c言語で、繰り返し文の中で、0....
-
doubleの変数にintとintの割り...
-
至急です! マクロ定義で #defi...
-
C言語の型による処理速度の違い
-
C言語 関数プロトタイプ宣言の...
-
2次方程式の解を求めるプログ...
-
関数におけるif文とreturn文に...
-
doubleは常に%lfとするべきなのか
-
int とdoubleの比較
-
C言語のプログラムで#include<m...
-
C言語で-23乗を取り扱うには
-
データ数の多い構造体配列
-
指数の表示
-
C言語のpow関数の不具合
-
c言語のプログラミングについて...
-
c言語のコンパイルエラー canno...
おすすめ情報