提问人:RTC222 提问时间:11/11/2023 最后编辑:Sep RolandRTC222 更新时间:11/13/2023 访问量:43
无法获取“vrndscalepd”的正确舍入模式代码
Unable to get correct rounding mode code for `vrndscalepd`
问:
我正在打电话对 ZMM 寄存器进行四舍五入。要四舍五入的寄存器是:vrndscalepd
{3.9304247359239284, 0.85804618270500566, 1.899940908279022,
1.5554455222287524, 9.1150061014624413, 9.3562881423859334,
1.3206387781690712, 9.0367010342260201}
我想将其中每个四舍五入到小数点后两位数,但我尝试过的舍入模式代码都没有这样做:
vrndscalepd zmm9{k1}{z},zmm8,32 ; 00100000
{4, 0.75, 2, 1.5, 9, 9.25, 1.25, 9}
vrndscalepd zmm9{k1}{z},zmm8,33 ; 00100001
{3.75, 0.75, 1.75, 1.5, 9, 9.25, 1.25, 9}
vrndscalepd zmm9{k1}{z},zmm8,34 ; 00100010
{4, 1, 2, 1.75, 9.25, 9.5, 1.5, 9.25}
vrndscalepd zmm9{k1}{z},zmm8,35 ; 00100011
{3.75, 0.75, 1.75, 1.5, 9, 9.25, 1.25, 9}
vrndscalepd zmm9{k1}{z},zmm8,41 ; 00110001
{3.75, 0.75, 1.75, 1.5, 9, 9.25, 1.25, 9}
vrndscalepd zmm9{k1}{z},zmm8,42 ; 00110010
{4, 1, 2, 1.75, 9.25, 9.5, 1.5, 9.25}
这些都不能满足我的要求。在 AVX512 上,我是否错过了另一种舍入模式,该模式将四舍五入到小数点后两位,而不会四舍五入到最接近的偶数倍数 0.25?有没有其他指令可以使用 ZMM 寄存器执行我想要的操作?
答:
2赞
Peter Cordes
11/11/2023
#1
不,AVX-512 使用二进制浮点数,而不是十进制。
(https://en.wikipedia.org/wiki/Double-precision_floating-point_format)
3.93
不能完全表示为浮点数或双精度值,因此任何指令序列都不可能创建表示它的位模式。(https://www.h-schmidt.net/FloatConverter/IEEE754.html)
你当然可以做一些得到接近值的事情,比如 ,但这并不像像那样将尾数的一些低位归零那么简单。这必然会产生一个值,该值可以表示为具有 2 次幂分母的分数(因为所有 FP 值都是这样的。“更圆润”的二进制 FP 值将具有较小的分母;基数点后有 2 位,分母将为 4,因此 、 、 或 是唯一的可能性。3.9300000667572021484375f
vrndscaleps/pd
.0
.25
.5
.75
四舍五入到 2 位小数的正常方法是乘以 100.0,四舍五入到最接近的整数,再乘以 。我不知道有没有更有效/更聪明的东西。(请注意,这并不完全可表示,因此除以可能更精确。1.0/100
1.0/100
100.0
评论
1赞
Eric Postpischil
11/11/2023
回复“请注意,这并不完全可表示,因此除以可能更精确”:乘以 100 时会出现舍入误差,除以时会出现另一个误差,因此除以 100 而不是乘以不会给出完全正确的舍入函数。我预计它可能会产生一些偏差超过 0.01 的结果(乘法四舍五入,例如,当 91.4999 时产生 91.5......本来是需要 5 的,后来除法也四舍五入,产生了略高于 .92 的东西,所以最终结果与 .91 相差超过 0.01)。1.0/100
100.0
1.0/100
0赞
Eric Postpischil
11/11/2023
顺便说一句,是代码字体,所以它代表了一个程序所做的事情,所以它的结果是可表示的,因为结果是程序产生的任何东西。对于这些情况下的符号,我使用纯字体(或数学排版,如果可行)进行数学计算,使用代码字体进行计算。所以 1.0/100 或 1/100 是百分之一,是计算结果。1.0/100
1.0/100
0赞
Peter Cordes
11/11/2023
@EricPostpischil:我没有去寻找关于四舍五入到一定数量的十进制数字的规范问答。关于可能具有超过 0.5 ulp 的总舍入误差的好点。我想知道是否有一种有效的算法可以给出正确的四舍五入的结果。nearbyint(x*100)/100.0
0赞
Peter Cordes
11/11/2023
至于,这是一个汇编问题,所以我将通过争辩说该表达式的 C 解释没有含义来摆脱它;它可能是一个有理数。但实际上,我选择而不是是基于 int 与 FP 文字的 C 解释:P我想另一种说法是,如果用 FP 数学计算,这是不准确的。计算该表达式将引发 FP 不精确异常。1.0/100
1.0
1/100
1.0/100
1赞
Eric Postpischil
11/11/2023
我希望理想的四舍五入到十进制任务涉及与将二进制转换为十进制进行打印的问题大致相同的问题,并且将使用相同的复杂算法,除了在某些方面受到限制的情况,例如四舍五入到输入的位数或输入量级。
评论