3

2 つの整数の範囲に含まれる値を、別の範囲に含まれる別の整数に変換しようとしています。出力値を入力整数の対応する値にしたい(比率を考慮して)。より明確にするために、解決したい問題の例を次に示します。

  • 範囲 (10, 28) に含まれる 3 つの整数、たとえば 10、28、13 があるとします。10 は可能な最小値、28 は可能な最大値です。
  • 出力として、範囲(5、20)の「対応する」数値に変換された整数が必要です。この正確な例では、10 は 5 に、28 は 20 に、13 は 5 から 20 の間の値に変換され、比率を維持するために再スケーリングされます。その後、この値は整数に変換されます。

python でそのような「再スケーリング」を実現するにはどうすればよいですか? 通常の計算を試みました(value/max of first range)*max of second rangeが、まれな場合を除いて間違った値が返されます。

最初はPythonでの除算に問題がありましたintが、これを修正した後でも値が間違っています。たとえば、例に示されている値を使用するint((float(10)/28)*20)と、結果として 7 が得られます。最初の範囲で可能な最小値であるため、5 を返す必要があります。

(論理と数学の観点から)少し明白なように感じますが、何かが欠けています。

4

1 に答える 1

7

間違った結果が得られる場合は、除算が常に整数になる Python2 を使用している可能性があります (そのため、スケーリング係数に関しては、多くの丸め誤差と「ゼロ」が発生します。

Python3 では、除算が浮動小数点数を返すようにこれを修正しました。Python2 では、回避策は from __future__ import division、コードの最初の行に a を配置するか (推奨)、除算オペランドの少なくとも 1 つを明示的に浮動小数点数に変換することです。

from __future__ import division

def renormalize(n, range1, range2):
    delta1 = range1[1] - range1[0]
    delta2 = range2[1] - range2[0]
    return (delta2 * (n - range1[0]) / delta1) + range2[0]
于 2016-02-11T14:46:13.553 に答える