【回転】負数の型取り演算
1598 ワード
異なる言語では,負の数に対して型取り演算を実行し,結果が異なる可能性があることを知っている.例えば、(−11)%5はpythonで計算された結果が4であり、C(C 99)で計算された結果は−1である.
truncate除算&&floor除算多くのプログラミング言語では、整数aが整数bの整数倍数でなければ、a、bが除算した実際の結果の小数部分が切り取られ、このプロセスをエンドポイントと呼ぶ.除算の結果が正数であれば、一般的なプログラミング言語では結果がゼロになります.つまり、商の小数部を直接除去します.しかし、除算の結果が負数であれば、異なる言語では通常2つの異なる終端方法が採用されている.1つはゼロ終端(truncate toward zero)であり、もう1つは負無限終端(truncate toward negative infinity)である.従って、2つの除算はそれぞれtruncate除算とfloor除算と呼ばれている.実際、除算の結果が正負であってもtruncate除算はゼロになると考えられる.floor除法はいずれも負の無限の結末である.
型取り演算型取り演算は実際には2つの数を除いた余剰数を計算する.qがa,b相殺によって生成された商(quotient)であり、rが対応する剰余(remainder)であると仮定すると、ほとんどの計算システムでは、a=b*q+rが満たされ、|r|r=a−(a/b)*bである.
一般言語(1)C/Java言語C/Java言語除算はゼロになる(実際、C 89は除数または除数の1つが負の場合の結果は定義されていない;C 99は正式にゼロになることを確定した)、すなわちtruncate除算を採用している.型取り演算子は%であり、この演算子は整数オペランドのみを受け入れます.1つの法則は、型取り演算の結果の記号が最初のオペランドの記号と同じ(または0)である.したがって
(2)C++言語C++言語の終端方式は特定の機器に依存する.両方のオペランドが正である場合、型取り演算の結果も正(または0)である.2つのオペランドがいずれも負数である場合、型取り演算の結果は負数(または0)である.1つのオペランドが負の場合、型取り演算の結果は、特定の実装に依存する.
(3)Python言語Python言語除法は,負に向かう無限断,すなわちfloor除法を採用している.型取り演算子も%であり、浮動小数点オペランドを受け入れることができます.1つの類似の法則は、型取り演算の結果の記号が2番目のオペランドの記号と同じである.したがって
(4)Common Lisp Common Lispの特殊オペレータ(special operator)"/"の結果はスコアであるため,終端の問題はない.しかし、Common Lispは、TRUNCATE関数とFLOOR関数のそれぞれが上記の2つの除算に対応することを提供する.従って、Common LispのREM関数はC/Java言語における型取り演算に類似する.MOD関数はPython言語の型取り演算に似ている.
変換元:http://www.cnblogs.com/ppboy_dxh/archive/2011/02/18/1958175.html
truncate除算&&floor除算多くのプログラミング言語では、整数aが整数bの整数倍数でなければ、a、bが除算した実際の結果の小数部分が切り取られ、このプロセスをエンドポイントと呼ぶ.除算の結果が正数であれば、一般的なプログラミング言語では結果がゼロになります.つまり、商の小数部を直接除去します.しかし、除算の結果が負数であれば、異なる言語では通常2つの異なる終端方法が採用されている.1つはゼロ終端(truncate toward zero)であり、もう1つは負無限終端(truncate toward negative infinity)である.従って、2つの除算はそれぞれtruncate除算とfloor除算と呼ばれている.実際、除算の結果が正負であってもtruncate除算はゼロになると考えられる.floor除法はいずれも負の無限の結末である.
型取り演算型取り演算は実際には2つの数を除いた余剰数を計算する.qがa,b相殺によって生成された商(quotient)であり、rが対応する剰余(remainder)であると仮定すると、ほとんどの計算システムでは、a=b*q+rが満たされ、|r|r=a−(a/b)*bである.
一般言語(1)C/Java言語C/Java言語除算はゼロになる(実際、C 89は除数または除数の1つが負の場合の結果は定義されていない;C 99は正式にゼロになることを確定した)、すなわちtruncate除算を採用している.型取り演算子は%であり、この演算子は整数オペランドのみを受け入れます.1つの法則は、型取り演算の結果の記号が最初のオペランドの記号と同じ(または0)である.したがって
(-11)%5=-11-[(-11)/5]*5=-11-(-2)*5=-1
.(2)C++言語C++言語の終端方式は特定の機器に依存する.両方のオペランドが正である場合、型取り演算の結果も正(または0)である.2つのオペランドがいずれも負数である場合、型取り演算の結果は負数(または0)である.1つのオペランドが負の場合、型取り演算の結果は、特定の実装に依存する.
(3)Python言語Python言語除法は,負に向かう無限断,すなわちfloor除法を採用している.型取り演算子も%であり、浮動小数点オペランドを受け入れることができます.1つの類似の法則は、型取り演算の結果の記号が2番目のオペランドの記号と同じである.したがって
(-11)%5=-11-[(-11)/5]*5=-11-(-3)*5=4
.ここで注意しなければならないのは、Python 3.xの「/」演算子の意味が変化し、「/」の結果は終わりません.対応する//演算子の結果が最後に表示されます.(4)Common Lisp Common Lispの特殊オペレータ(special operator)"/"の結果はスコアであるため,終端の問題はない.しかし、Common Lispは、TRUNCATE関数とFLOOR関数のそれぞれが上記の2つの除算に対応することを提供する.従って、Common LispのREM関数はC/Java言語における型取り演算に類似する.MOD関数はPython言語の型取り演算に似ている.
変換元:http://www.cnblogs.com/ppboy_dxh/archive/2011/02/18/1958175.html