【发布时间】:2018-09-20 20:41:48
【问题描述】:
通常,您可以使用以下公式将值 input 从一个范围 [inputMin, inputMax] 转换为另一个范围 [outputMin, outputMax]:
output = (input-inputMin) * ((outputMax-outputMin)/(inputMax-inputMin)) + outputMin
但是如果inputMax = double.MaxValue 和inputMin = double.MinValue 呢?然后inputMax - inputMin == double.PositiveInfinity 整个公式就落伍了。
有没有更好的方法在以下限制下进行这种转换?
- 完全在数据类型的限制范围内
- 适用于任意范围
- 如果
inputMax >= outputMax和inputMin <= outputMin
【问题讨论】:
-
您可能会为此使用Microsoft's BigRational library。获取它的最简单方法是通过 NuGet。驴多年没有更新了,但它应该仍然可以正常工作。
-
正如我所说,我想保持在给定的数据类型内。主要是出于性能原因,但也因为我只是对手头的问题感兴趣。
-
您不能在不受该数据类型限制的情况下停留在该数据类型内。您要求任意精度,显然这将需要超过
double的 64 位(或在某些情况下为 80 位)。 -
我不需要任意精度。范围越来越小(检查限制),所以无论如何都会损失精度。因为范围越来越小,我很确定应该有解决问题的办法。
-
单个比例因子是不够的。
inputMax-inputMin可能很大,比如 2^1000 左右,而outputMax-outputMin可能很小,比如 2^-1000 左右。那么比例因子将在 2^-2000 左右,这太小而无法以 IEEE 64 位二进制浮点格式表示。因此,一个解决方案将涉及至少两个缩放。
标签: c# floating-point