c++ - SSE 舍入精度

标签 c++ optimization rounding sse

我对 SSE 舍入有一个小问题。该代码是不言自明的,我正在尝试获取 293.05694580 中 0.0001 的计数,包括一些舍入(例如,5.21 中有 52 个 0.1)...

#include <xmmintrin.h> 
#include <emmintrin.h> 

int main(void)
{
    float val       = (float) 293.05694580;
    float tickSize  = (float)   0.0001;

    __m128 _val     = _mm_set_ps1( val );
    __m128 _shift   = _mm_set_ps1( 1 / tickSize );

    /* 293.0569480 * 10000 should be 2930569.480 */
    __m128 _mul     = _mm_mul_ps(_val, _shift);

    /* Rounding 2930569.480 should get 2930569, but returns 2930570 instead. Why? */
    __m128i _ticks  = _mm_cvtps_epi32( _mul );
}

最后,如何恢复 _ticks 中结果的排序? 非常感谢, 丹尼尔

最佳答案

检查中间结果,不要假设

检查/设置 sse 舍入模式

用整数来计数

关于c++ - SSE 舍入精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12880660/

相关文章:

c++ - Rextester语言编译C++问题

c++ - 常量操作数与任何算术运算符的顺序是否会影响优化?

optimization - ARM 程序集中分支上的延迟结果指令会发生什么情况?

sql - 在 Oracle SQL 中舍入为 0.5 或 1.0

java - 如何显示星号的数量到最接近的千位?

c++ - 有效的算法,用于按键排序对象,范围从 0 到 100,用于大输入大小

c++ - 当我用基数2 ^ 20实现基数排序以对大小为500万的数组进行排序时,为什么该程序会陷入无限循环?

mysql - 优化查询以不使用文件排序

c - 不知道如何处理 C 中的重复小数

c++ - 为什么使用英特尔 C++ 编译器时 NaN - NaN == 0.0?