2016-05-17 7 views
1

yが64より大きい場合、powの結果はどうしてですか?yが64を超えると、なぜpow関数が0を返しますか?

package main 

import (
    "fmt" 
) 

func pow(x uint64, y uint64) uint64 { 
    if y > 64 { 
     return 0 
    } 
    var result uint64 = 1 
    var counter uint64 
    var previous uint64 
    for y > 0 { 
     previous = result 
     result = result * x 
     y = y - 1 
     counter++ 
     if result == 0 { 
      return previous 
     } 
    } 
    return result 
} 

func main() { 
    result1 := pow(2, 64) 
    fmt.Println(result1) 
    result2 := pow(2, 32) 
    fmt.Println(result2) 
    result3 := pow(2, 3) 
    fmt.Println(result3) 
} 

これはベース2になっていることがわかりました。これについてあなたはどう思いますか? (私はまだプログラミングとゴランで新しいです。)

+2

'2^64'は' uint64'に収まりません。 (実際には基底2とは関係がありません。実際には、任意の基数で固定サイズの整数で起こりますが、「ランダムなオーバーフロー」ではなく完全な0になるという意味です。 – Thilo

+0

コードにバグがあります。私の答えをチェックしてください。 – khrm

+0

Thiloとkhrmの両方から正しい答えを得ました。しかし、あなたのコードはそこに到達することさえありません - 'y> 64 return 0'の条件があります。だから、y> 64 ... – MirekE

答えて

0

あなたの力はyに基づいてはなりません。それはより大きい数のために少なくなります。

使用この:

`

// Assuming that b will never be 0 
func mult(a, b uint64) (uint64, bool) { 
    result := a * b 
    return result, (result/b == a) 
} 

func pow(x uint64, y uint64) uint64 { 
if y == 0 { 
    return 1 
} 
if x == 0 { 
    return 0 
} 
var result uint64 = 1 
var counter uint64 
var previous uint64 
var ok bool 
for y > 0 { 
    previous = result 
    result, ok = mult(result, x) 
    if !ok { 
     return 0 
    } 

    y = y - 1 
    counter++ 
    if result == 0 { 
     return previous 
    } 
} 
    return result 
} 

明確化する前に、古い答え:

実はそれはuint64型は最大で持つことができるので、それは63でなければなりませんが、2 ^(として最も多くを持つことができます64)-1(2は64minux 1に上げる)。 2電源で生成できる最大数は2^63です。

コードを実行することで確認できます。 y> 64の制限を解除すると、63以上のすべての数値と同じ結果が得られます。 (9223372036854775808または2^63)。その制限はy> 63でなければなりません。

+0

@Efoxこれであなたの質問は解決しましたか? – khrm

関連する問題