

No.2ベストアンサー
- 回答日時:
押さえておくべきことは、以下の点です。
・小数点を含んだ定数の型は double (float ではない)
・小数点を含んでいない定数の型は int
・float と double の演算は、一度 double に拡張されてから行われる。
この意味で、
float f = 1; は、int の 1 を最終的に float に変換して代入しています。
float f = 1.f; は、float の 1 を代入しています。
double d = 1; は、 int の 1 を double に変換して代入しています。
double d = 1.0; は、double の 1 を代入しています。
いずれにしても、
・単純な代入
・結果として、整数値になる場合
は、実害はありません。(比較を含めて)演算を行うときに問題が見えてきます。
たとえば、
float f = 0.1;
if ( f == 0.1) という比較は、失敗します。
これは、0.1 という double の値(これは、2進数展開したら、無限小数になります)と、float の 0.1 を double に拡張したものは、別の値になるからです。
説明のために、10進数で考えます。
float が、10進 3桁。 double が 10進6桁と仮定します。また、無限小数にするために、0.33333... を考えましょう。
float f = 0.3333333333;
で fに代入されるのは、この例では、 0.333 です。
ここで、
f == 0.3333333333333; の比較は、「一度 double の制度に合わされる」のですが、f は、float なので、0.333 を double に拡張して、 0.333000 になります。
一方、0.33333333333333 は、double 値として、(例では)6桁の精度を持ちますから、 0.333333 です。
つまり、0.333000 と 0.333333 を比較することになり、この比較は失敗します。
ここで、
float f = 0.1f;
if (f == 0.1f) であれば、同じ精度で比較されるので、この比較は、成功します。
他にも、float の f に対して、 f * 0.1; などとするのと、 f * 0.1f などとするのでは、前者が一度 doubleに変換されるため、結果が一致しない可能性があります。
また、単純な代入ではなく、
int x = 1;
double y = x / 3; と
double y = x / 3.; では、結果が異なります。
前者は、「小数点がない定数の型は int 」なので、int / int の計算がされて、一度、0となります。
これが、double に変換されて、y に代入されるので、 y は、0になります。
後者では、「小数点のある定数の型は double」なので、x / 3. は、int / double と見なされます。
この場合、割り算の前に、x が double に変換されて、double / double の計算が行われます。
この結果、x / 3. は、0.3333... という結果を持ちます。
故に、y の値は、 0.3333... になります。
こういう点は、注意すべき点です。
No.3
- 回答日時:
質問にだけ答えます。
> float f = 1;
> float f = 1.f;
> の違いだけでも、よいのかもしれません。
> 1.fと記述する'f'について知りたいのです。
末尾の f は、その浮動小数点定数がfloat型であることを意味しています。既に回答が出ているように、単なる 1 の場合には、いったんfloat型に型変換されてからオブジェクト f を初期化します。それに対して 1.f の場合は、もともとfloat型ですので型変換の必要性はありません。
どちらの場合もコンパイルされてしまえば(体感できないほどのコンパイル時間の微小な差を除けば)同じです。ただし、インタプリタでは実行時に型変換が行われることになるでしょうから、内部的な動作が異なる可能性はあります(見かけ上の動作は変わりません)。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語について コマンドラインで >変数 12.00 (char型) と、小数点付きの値を共用体に渡 1 2022/04/22 16:56
- C言語・C++・C# C++言語の16進数の表現についておしえてください 1 2022/11/14 17:46
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- 数学 単振り子とルンゲ・タック法 1 2022/07/15 00:05
- C言語・C++・C# C# 浮動小数の数値文字列化 1 2022/04/18 15:15
- C言語・C++・C# C言語: ポインタ 5 2022/06/01 08:33
- C言語・C++・C# ある線が円の範囲に入っているかの計算 1 2022/12/07 16:14
- PDF C#でfloatを整数部、小数部とも桁数固定で文字表示したい 2 2022/07/28 09:37
- C言語・C++・C# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
- C言語・C++・C# C言語のマクローリン展開ローラン展開のコードについて 3 2022/12/15 14:45
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
C言語で-23乗を取り扱うには
-
C言語を実行すると-infが出てき...
-
2次元配列 CXX0030とい...
-
doubleの変数にintとintの割り...
-
物体が往復する動きを作りたい
-
はさみうち法のプログラム(C言...
-
MATLAB:多数の画像を取り込み...
-
float型とdouble型の変数の違い...
-
doubleは常に%lfとするべきなのか
-
配列を戻り値にして逆行列を求...
-
(C,C++言語)関数の引数は自動キ...
-
sin(x)の近似について
-
2次方程式の解を求めるプログ...
-
実数型の変数に値を入力した計...
-
C言語のデバック 領域の二重解...
-
C言語の型による処理速度の違い
-
C 開放してるのにエラー(doubl...
-
64bit系でのmalloc
-
型宣言の場合分け
マンスリーランキングこのカテゴリの人気マンスリー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言語のプログラミングについて...
-
浮動小数点数が表示されないん...
おすすめ情報