celsius = (5.0/9.0) * (fahr-32.0);
C開発者が決定したのは単なる開発上の選択ですか、それとも理由がありますか? float は double よりも小さいと思うので、使用する 10 進形式がわからないために発生するオーバーフローを防ぐためかもしれません。それが理由ですか、それとも私は何かを見落としていますか?
celsius = (5.0/9.0) * (fahr-32.0);
この式で、5.0
、9.0
、および32.0
はdouble
です。これが浮動小数点定数のデフォルトの型です。それらをfloat
s にしたい場合は、F
接尾辞を使用します。
celsius = (5.0F/9.0F) * (fahr-32.0F);
fahr
がである場合double
、この最後の式の結果は: のままであることにdouble
注意してください。Vaibhav が指摘したように、型は精度が失われる可能性を回避するような方法で昇格されます。
その理由は、どんな結果も包含できるようにするためだと思います。したがって、最大のデータ型であるため、自然な選択は double です。
式が倍精度にキャストされる理由は、指定されたリテラルがデフォルトで倍精度値であるためです。式で使用されるリテラルを float として指定すると、式は float を返します。次のコードを検討してください (gcc 4.01 を使用する Mac OS X)。
#include <stdio.h>
int main() {
float celsius;
float fahr = 212;
printf("sizeof(celsius) ---------------------> %d\n", sizeof(celsius));
printf("sizeof(fahr) ------------------------> %d\n", sizeof(fahr));
printf("sizeof(double) ----------------------> %d\n", sizeof(double));
celsius = (5.0f/9.0f) * (fahr-32.0f);
printf("sizeof((5.0f/9.0f) * (fahr-32.0f)) --> %d\n", sizeof((5.0f/9.0f) * (fahr-32.0f)));
printf("sizeof((5.0/9.0) * (fahr-32.0)) -----> %d\n", sizeof((5.0/9.0) * (fahr-32.0)));
printf("celsius -----------------------------> %f\n", celsius);
}
出力は次のとおりです。
sizeof(celsius) ---------------------> 4
sizeof(fahr) ------------------------> 4
sizeof(double) ----------------------> 8
sizeof((5.0f/9.0f) * (fahr-32.0f)) --> 4
sizeof((5.0/9.0) * (fahr-32.0)) -----> 8
celsius -----------------------------> 100.000008
浮動小数点定数は、利用可能な最高の精度を持つ必要があります。結果は、あまり問題なく float に割り当てることができます。
K&Rv1 の時代には、float/double を同じ意味で使用することが推奨されていました。これは、浮動小数点型のすべての式が常に「double」表現を使用して評価されるためでした。これは、効率が最優先される場合の問題です。f、F、l、または L の接尾辞が付いていない浮動小数点定数は double 型です。また、文字 f または F がサフィックスの場合、定数は float 型です。また、l または L の文字が接尾辞として付いている場合は、long double 型です。