3

こんにちは私はGoプログラミング言語に不慣れです。

私はhttp://www.golang-book.com/から学んでいます

第4章の演習では、華氏から摂氏への変換に関する質問があります。

私は答えを次のようにコード化しました

    package main

import "fmt"

func main(){

    fmt.Println("Enter temperature in Farentheit ");

    var input float64

    fmt.Scanf("%f",&input)

    var outpu1 float64 = ( ( (input-32)* (5) ) /9)
    var outpu2 float64=  (input-32) * (5/9)
    var outpu3 float64= (input -32) * 5/9
    var outpu4 float64=  ( (input-32) * (5/9) ) 

    fmt.Println("the temperature in Centigrade is ",outpu1)
    fmt.Println("the temperature in Centigrade is ",outpu2)
    fmt.Println("the temperature in Centigrade is ",outpu3)
    fmt.Println("the temperature in Centigrade is ",outpu4) 
}

出力は次のとおりです。

sreeprasad:projectsInGo sreeprasad$ go run convertFarentheitToCentigrade.go 
Enter temperature in Farentheit 
12.234234
the temperature in Centigrade is  -10.980981111111111
the temperature in Centigrade is  -0
the temperature in Centigrade is  -10.980981111111111
the temperature in Centigrade is  -0

私の質問はoutpu2とoutpu4です。括弧は正しいですが、どのように、またはなぜ-0を出力するのですか。

誰か説明してもらえますか

4

2 に答える 2

7

簡単に言うと、式はwhich equals(5/9)として評価されます。試す(int(5)/int(9))0(5./9)

なぜこれが起こっているのかを明確にするために、式変数の型が決定される順序を扱います。

(5/9)上記のケース 2 と 4 に関係なく b/c が存在すると推測しinputます。コンパイラはそれらを解釈しint、単に式を 0 に置き換えます。その時点で、ゼロは入力に依存すると見なされ、float64最終的な前の型になります。コンパイル。

一般的に言えば、Go は数値型を変換しません。そのため、これが私にとって意味のある唯一の説明です。

于 2012-11-22T03:10:06.287 に答える
3

Go言語仕様は、IEEE-754標準に準拠した符号付き浮動小数点数を示してfloat32います。float64次のテキストはウィキペディアから引用されています-ゼロに署名

浮動小数点演算のIEEE754標準(現在、浮動小数点数をサポートするほとんどのコンピューターおよびプログラミング言語で使用されています)には、+0と-0の両方が必要です。ゼロは、1 / −0 = −∞および1 / + 0 = +∞、ゼロによる除算は±0/±0および±∞/±∞に対してのみ未定義であるような拡大実数線の変形と見なすことができます。 。

明らかにinput、マイナス32を適用すると、は負float64の別の値に変わります。に評価されます。負のタイミングはです。float645/90float640-0

興味深いことに、input整数に置き換えると、たとえば、の代わりに1取得されます。Goでは、浮動小数点数にはとの両方があるようですが、整数にはありません。0-0+0-0

編集: PhiLhoは、整数がそうではないのに浮動小数点数がそのようなものを持っている理由についてコメントで説明しています:正規化された浮動小数点数は+ 0、-0、NaN、+ Infinity、-Infinityの特別な表現を持っていますが、いくつかのビットの組み合わせを予約することはできませんそのような意味を持つ整数の。

于 2012-11-22T03:14:34.140 に答える