擅长:python、mysql、java
<p>使用整型参数会导致溢出,从而解释负值。此子表达式:</p>
<pre><code>(x - in_min) * (out_max - out_min)
</code></pre>
<p>只包含整数操作数,因此使用整数算术执行。这会溢出。产生负输出的第一个值是<code>x = 4530557</code>。让我们通过计算进一步挖掘:</p>
^{pr2}$
<p>并且该值大于<code>high(Integer)</code>,因此溢出为负值。在</p>
<p>您应该在函数中使用浮点参数,以避免此陷阱。在</p>
<p>对于其他值,这些值与执行算术的精度相同。Delphi代码以64位扩展精度执行算术。53位双精度的Python代码。在</p>
<p>在我看来,最好避免64位扩展精度。它是非标准的,仅限于某些平台。它在32位x86上可用,但64位x64编译器将SSE单元用于浮点,并且该单元不支持64位扩展精度。最重要的是,数据类型的对齐导致读/写内存性能非常差。在</p>
<p>所以,如果你想要算术的可移植性,我建议你坚持53位双精度。停止使用<code>Extended</code>类型,改用<code>Double</code>。以及配置浮点单元以操作到53位精度。在</p>
<p>因此,最终结果是这个函数:</p>
<pre><code>function map(const x, in_min, in_max, out_min, out_max: Double): Double;
begin
result := (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
end;
</code></pre>