C 如何将浮点输入转换为整数并保持最大精度?

C 如何将浮点输入转换为整数并保持最大精度?,c,floating-point,floating-accuracy,floating-point-precision,floating-point-conversion,C,Floating Point,Floating Accuracy,Floating Point Precision,Floating Point Conversion,我必须使用一种算法,它需要一个整数矩阵作为输入。我的输入是实值的,因此我想在将其传递给算法之前将其转换为整数 我想用一个大常数来缩放输入,然后将其四舍五入为整数。这看起来是一个很好的解决方案,但如何确定要使用的良好常数,特别是因为浮点输入的范围可能因情况而异?还欢迎任何其他想法?首先将您的输入标准化为[0,1)范围,然后使用一种常用方法来缩放它们: f(x) = range_max_exclusive * x + range_min_inclusive 在这之后,将f(x)(如果愿意,也可以舍

我必须使用一种算法,它需要一个整数矩阵作为输入。我的输入是实值的,因此我想在将其传递给算法之前将其转换为整数


我想用一个大常数来缩放输入,然后将其四舍五入为整数。这看起来是一个很好的解决方案,但如何确定要使用的良好常数,特别是因为浮点输入的范围可能因情况而异?还欢迎任何其他想法?

首先将您的输入标准化为[0,1)范围,然后使用一种常用方法来缩放它们:

f(x) = range_max_exclusive * x + range_min_inclusive
在这之后,将f(x)(如果愿意,也可以舍入)转换为整数。这样,您就可以处理诸如实值在范围
[0,1)
[0,n]中的情况,其中n>1

通常,您最喜欢的库包含矩阵运算,您可以轻松地实现这种技术,并且比可能的实现具有更好的性能

编辑:缩小然后放大肯定会丢失一些精度。我喜欢这样做,因为标准化操作通常随库而来。您也可以通过以下方式不缩小尺寸:

f(x) = range_max_exlusive / max_element * x + range_min_inclusive

对于这个问题,最好的一般答案可能是找出算法可以接受为矩阵中元素的最大整数值是多少,而不会导致算法本身溢出。一旦有了这个最大值,在输入数据中找到最大浮点值,然后按这些t的比率缩放输入wo最大值并四舍五入到最接近的整数(避免截断)


实际上,您可能无法做到这一点,因为您可能无法确定算法在不溢出的情况下可以接受的最大整数值。可能您不知道算法的细节,或者它以一种复杂的方式依赖于所有输入值。如果是这种情况,您只需选择任意的最大值输入值似乎工作得很好。

在问题正文中,与精度无关。@Seckin通过
按大常量缩放输入,我希望是他的意思是在四舍五入之前将每个浮点值乘以该值;这就是提高精度的方法。如果可以确定最大值,使常数不会导致溢出,那么最大精度将在整数的宽度内达到。在我的回答中,它永远不会溢出,因为缩放之前的所有值都小于1,所以ur
range_max_exclusive>=任意元素
。选择一个有效的浮点值,该值在进行铸造/舍入时具有有效的整数值,您对它很在行。@SeçkinSavaşı与Mah在上文中所评论的一样,其想法是在整数大小内保持最大精度。上述问题的答案待定,缩放到小于ma的值整数的最大范围可能是理想的。例如,选择二的幂,以便按其缩放生成[-224224]中的整数足以捕获最大值的有效位的所有位(如果它们是32位IEEE 754)但是,在没有溢出的情况下,为进一步的算术留出了一些空间。此外,按2的幂进行缩放可以避免引入额外的舍入错误,尽管在转换为整数时当然会有舍入。这个答案可以转换为缩放(它将x映射到ax+b),但问题只要求缩放(b为零).我们不知道后续算法是否会产生平移后不变的结果(或者可以通过一些简单的变换进行纠正)。