当前位置: 首页 > 知识库问答 >
问题:

浮点整数算法

东方富
2023-03-14
float x;
int& x_i = *reinterpret_cast<int*>(&x);
x_i &= 0x7f800000
x_i >>= 23;
x_i %= 2;
x_i <<= 23;

我的问题是,是否有一种方法可以在不通过堆栈的情况下完成所有这些操作。x86_64是否有将xmm0的内容复制到eax或其他通用寄存器的内插?

编辑:问题本身在讨论过程中发生了变化。最后有两个备注,在这两个备注中,我都引用了Intel C++复杂参考的相应部分。

>

  • 可以使用intrinsics在通用Regiter和XMM寄存器之间移动数据(“Steaming SIMD Extensions->流式SIMD Extensions的转换操作”和“Steaming SIMD Extensions 2->整数intrinsics->流式SIMD Extensions的整数移动操作2”部分)

    这两个话题我都特别感兴趣。

  • 共有1个答案

    喻昀
    2023-03-14

    我很惊讶gcc竟然涉及到堆栈。至少对于ELF(SysV)ABI,第一个浮点参数将由%xmm0中的寄存器传递。

    如果我理解正确的话,您希望将浮点值移动到32位GPR中进行按位操作。您可以通过movd指令来完成:

    movd %xmm0, %eax
    

    在C语言中,您可以查看程序集输出:

    #include <immintrin.h> /* or older: <xmmintrin.h> */
    ...
    unsigned int x_i;
    *((float *) & ret) = _mm_cvtss_f32(v0);
    
     类似资料:
    • 所有数字都更改为浮点,带有一个<代码>。0连接到末尾。 我试过parseInt、toFixed、round、floor和其他所有明显的选择。 一个简单的例子: 日志显示“Number”类型的浮点值,长度值为5.0。 任何添加数字的尝试都会导致相同的结果 日志仍显示浮点值 我希望返回一个整数

    • 问题内容: 这是故意的吗?我强烈记得以前的版本返回了吗?我该怎么办,有没有新的分公司运营商,或者我必须始终选拔? 问题答案: 更改除法运算符

    • 问题内容: 5年前关闭。 我必须将两个整数相除并得到一个浮点数作为我的代码: 我用调试器检查值 为什么结果为0.0?我应该怎么做才能获得正确的浮动? 问题答案: 当您将两个数相除时,将执行整数除法,在这种情况下,将导致22/64 =0。只有完成此操作后,您才能创建一个。和的表示是。如果要执行浮点除法,则应 在 除法 之前进行 强制转换:

    • 我阅读关于浮点和舍入在浮点算术期间发生的错误。 我读了很多关于IEEE754单精度/双精度格式的文章。我知道有符号位、8(或)11位指数和23(或)52位有效位以及隐式前导位。 我也知道分母不是质因数2的实数不能完全表示,例如二进制中的0.1是0.0001100110011...... 我知道0.1 0.1 0.1不等于0.3,因为舍入误差的累积。 同样,0.5也可以用二进制格式表示,因为它是1/

    • 问题内容: 我正在做s和s的乘法和除法,但我忘记了隐式转换规则(问题中的单词似乎太含糊,以至于Google不能比在这里问得更快)。 如果我有两个s,但我想进行浮点除法,是否只需要强制转换一个或两个操作数?如何相乘-如果我将a 和an 相乘,答案是a 吗? 问题答案: 您不能将结果除以a ,反之亦然。 因此答案是: 如果我有两个s,但是我想做浮点除法…? 一个演员就足够了。 如果我将a 和an 相乘

    • 问题内容: 我正在尝试删除列表中为负的浮点值。具有所有值的原始列表如下所示: 在我运行一个循环之后,显示列表如下所示: 因此,某些负面信息,例如被删除,而其他则没有。为什么是这样? 问题答案: 您正在遍历列表并对其进行变异,这意味着您最终删除了错误的元素,可以使用reversed: 或制作副本: 您还可以使用列表组件来修改原始列表: