5

celsius = (5.0/9.0) * (fahr-32.0);

C開発者が決定したのは単なる開発上の選択ですか、それとも理由がありますか? float は double よりも小さいと思うので、使用する 10 進形式がわからないために発生するオーバーフローを防ぐためかもしれません。それが理由ですか、それとも私は何かを見落としていますか?

4

5 に答える 5

26
celsius = (5.0/9.0) * (fahr-32.0);

この式で、5.09.0、および32.0doubleです。これが浮動小数点定数のデフォルトの型です。それらをfloats にしたい場合は、F接尾辞を使用します。

celsius = (5.0F/9.0F) * (fahr-32.0F);

fahrがである場合double、この最後の式の結果は: のままであることにdouble注意してください。Vaibhav が指摘したように、型は精度が失われる可能性を回避するような方法で昇格されます。

于 2008-09-01T18:06:24.437 に答える
4

その理由は、どんな結果も包含できるようにするためだと思います。したがって、最大のデータ型であるため、自然な選択は double です。

于 2008-09-01T17:51:13.553 に答える
3

式が倍精度にキャストされる理由は、指定されたリテラルがデフォルトで倍精度値であるためです。式で使用されるリテラルを 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
于 2008-09-01T18:14:40.970 に答える
1

浮動小数点定数は、利用可能な最高の精度を持つ必要があります。結果は、あまり問題なく float に割り当てることができます。

于 2008-09-01T17:51:30.433 に答える
1

K&Rv1 の時代には、float/double を同じ意味で使用することが推奨されていました。これは、浮動小数点型のすべての式が常に「double」表現を使用して評価されるためでした。これは、効率が最優先される場合の問題です。f、F、l、または L の接尾辞が付いていない浮動小数点定数は double 型です。また、文字 f または F がサフィックスの場合、定数は float 型です。また、l または L の文字が接尾辞として付いている場合は、long double 型です。

于 2009-08-20T15:37:01.273 に答える