无法获取 vrndscalepd 的正确舍入模式代码

问题描述 投票:0回答:1

我正在调用 vrndscalepd 来舍入 zmm 寄存器。要舍入的寄存器是:

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 上,是否还有另一种我错过的舍入模式,该模式会舍入到小数点后 2 位,而不舍入到最接近的 0.25 的偶数倍?是否有另一条指令可以在 zmm 寄存器上执行我想要的操作?

assembly floating-point x86-64 nasm avx512
1个回答
1
投票

不,AVX-512 使用二进制浮点数,而不是十进制。
https://en.wikipedia.org/wiki/Double- precision_floating-point_format

3.93
不能完全表示为浮点数或双精度数,因此任何指令序列实际上都不可能创建表示它的位模式。 (https://www.h-schmidt.net/FloatConverter/IEEE754.html)

您当然可以做一些获得接近值的事情,例如

3.9300000667572021484375f
,但这并不像像
vrndscaleps/pd
那样将尾数的一些低位清零那么简单。
例如乘以 100.0,四舍五入到最接近的整数,乘以
1.0/100

© www.soinside.com 2019 - 2024. All rights reserved.