gpt4 book ai didi

c# - 在给定数据类型的限制范围内将一个值从一个任意范围映射到另一个范围

转载 作者:行者123 更新时间:2023-11-30 22:59:09 26 4
gpt4 key购买 nike

通常你可以转换一个值input来自一个范围 [inputMin, inputMax]到另一个范围[outputMin, outputMax]使用以下公式:

output = (input-inputMin) * ((outputMax-outputMin)/(inputMax-inputMin)) + outputMin

但是如果 inputMax = double.MaxValue 怎么办?和 inputMin = double.MinValue ?那么inputMax - inputMin == double.PositiveInfinity整个公式都失败了。

在以下限制下,是否有更好的方法来进行此转换?

  • 完全在数据类型的范围内
  • 对于任意范围
  • 如果inputMax >= outputMaxinputMin <= outputMin

最佳答案

为避免 inputMax - inputMin 溢出到无穷大,缩放 input、inputMin、inputMax,全部由 /2 决定。除了一些小值外,这应该是准确的:设置了最低有效位的次法线。

x = input/2;  // scale `input` also
x0 = inputMin/2;
x1 = inputMax/2;
dx = x1 - x0;

@aka.nice很好地确定了下面改进的精度方法的局限性。稍后再评论。


要保持精度很棘手,但要形成 interpolation以 x 解释的方式使用 FP 数学具有优势。主要思想不是从 y-mx*b 形成一些小的 y,因为它在乘法之后进行加法。任何加法/减法都容易因取消而严重损失精度。

y = (x - x_intercept)*slope

x 截距 x_intercept = (x1*y2 - x2*y1)/(y2 - y1) 有其自身的一系列问题。如果可能,这应该在扩展数学中完成。除此之外,我们可以利用对于现实生活中的应用程序,x_intercept 预计不会是极端的,因此在最重要的时候为我们节省了 x - x_intercept 的一些精度( y 会比较小)。

y0 = outputMin/2;
y1 = outputMax/2;
dy = y1 - y0;

// Avoid (y1*x0 - y0*x1)/dy to prevent overflow in the multiplications
x_intercept = y1/dy*x0 - y0/dy*x1;
y = (x - x_intercept)/dx*dy;
output = 2*y; // scale `output` at the end.

outputMin == outputMax 等特殊情况可以根据需要通过测试处理。

此方法类似于 @aka.nice .然而,不是中间的 x,代码看起来是计算 x 截距。

关于c# - 在给定数据类型的限制范围内将一个值从一个任意范围映射到另一个范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52433020/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com