この２つのコードのどこが異なるのか教えて下さい。


`python3系`で除算をしたあとの整数への変換にいつも`int()`を使っていましたが、AtCoderの他の人の回答を見ると`//`を使用していました。

[code]

    a = 3 / 2
    print(int(a)) # 今までのやり方
    
    a = 3 // 2
    print(a)      # 正しいやり方（？）
    
[/code]

確かにAtCoderでも`int()`を使うと間違いと判定され、`//`に変えてみたところ正解になった問題がありました。

自分では違いが全くわかっていませんが、全然違うものなのでしょうか？

追記：質問の仕方が悪かったので補足します。  
`int()`を使う場合と`//`を使う場合出力される結果は同じになると思いますが、AtCoderでコードを提出したところ`int()`で整数に変換したものは間違いと判定されてしまいました。  
`//`で最初から整数値のみを算出したものは正解と判定されたので不思議と思って質問しました。

それぞれの意味はおおまかには理解していますが、結果が変わる場合があることは認識していませんでした。  
違う結果が出力される場合はどのようなときなのでしょうか？

参考までにそれぞれのコードを貼っておきます。

[code]

    # 間違いと判定されたコード
    n, a, b = map(int, input().split())
    if (b - a) % 2 == 0:
        ans = (b-a)/2
    else:
        ans = min(a-1, n-b) + 1 + (b-a-1)/2
    print(int(ans))
    
[/code]

[code]

    # 正解と判定されたコード
    n, a, b = map(int, input().split())
    if (b - a) % 2 == 0:
        ans = (b-a)//2
    else:
        ans = min(a-1, n-b) + 1 + (b-a-1)//2
    print(ans)
    
[/code]

上記のお題はAtCoderの「AtCoder Grand Contest 041」のA「Table Tennis Training」です。




編集後のご質問の主文 **_違う結果が出力される場合はどのようなときなのでしょうか？_** だけに限っての回答ですが。

ちなみに、 ** _上記のお題はAtCoderの「AtCoder Grand Contest 041」のA「Table Tennis
Training」です。_** といった情報は最初からご質問に含めておいた方が良いでしょう。

出題中にこんな制約があります。

  * 2≤N≤10¹⁸
  * 1≤A<B≤N
  * 入力中のすべての値は整数である。

この値の範囲を見ると、分かる人なら「ははぁん」と納得して、「どのようなとき」に「違う結果が出力されるか、すぐに例が作れてしまうでしょう。

[code]

    a = 2
    b = 1000000000000000000
    ans = (b-a)/2
    print(int(ans)) #->500000000000000000
    
    ans = (b-a)//2
    print(ans)      #->499999999999999999
    
[/code]

Pythonの`float`型は64ビットの浮動小数点数で、10進換算で15〜16桁の精度しかなく、`499999999999999999`のような18桁ある整数値を正確に表すことができません。従って、計算結果を`float`型に変換する`/`除算では結果を正確に表すことができない訳です。

出題に「10¹⁸」なんて値が設定してあるのには、単にループや再帰などを使った繰り返し型の回答を排除するだけでなく、
**途中計算に`float`型を使うと正しい結果が得られない** ように設定したかったのだろうと思われます。




編集後のご質問の主文 **_違う結果が出力される場合はどのようなときなのでしょうか？_** だけに限っての回答ですが。

ちなみに、 ** _上記のお題はAtCoderの「AtCoder Grand Contest 041」のA「Table Tennis
Training」です。_** といった情報は最初からご質問に含めておいた方が良いでしょう。

出題中にこんな制約があります。

  * 2≤N≤10¹⁸
  * 1≤A<B≤N
  * 入力中のすべての値は整数である。

この値の範囲を見ると、分かる人なら「ははぁん」と納得して、「どのようなとき」に「違う結果が出力されるか、すぐに例が作れてしまうでしょう。

[code]

    a = 2
    b = 1000000000000000000
    ans = (b-a)/2
    print(int(ans)) #->500000000000000000
    
    ans = (b-a)//2
    print(ans)      #->499999999999999999
    
[/code]

Pythonの`float`型は64ビットの浮動小数点数で、10進換算で15〜16桁の精度しかなく、`499999999999999999`のような18桁ある整数値を正確に表すことができません。従って、計算結果を`float`型に変換する`/`除算では結果を正確に表すことができない訳です。

出題に「10¹⁸」なんて値が設定してあるのには、単にループや再帰などを使った繰り返し型の回答を排除するだけでなく、
**途中計算に`float`型を使うと正しい結果が得られない** ように設定したかったのだろうと思われます。

