cvttsd2si RAX, xmm0 //Целое число, округление до меньшей части
cvtsi2sd xmm1, RAX //Целое число в число с плавающей точкой
subpd xmm0, xmm1 //соотвественно вычитание
Но данные действия не всегда дают должный эффект. Например при числе "3.1", все нормально. В случае с "3.11", будет что-то вроде "3.10(9)". Я конечно понимаю что числа храняться неточно, но не до такой-же степени! Например, если число будет "3.11" и его домножить на "100", то в памяти будут положенные "311.0".
На FPU использовал инструкцию получения остатка от деления, а в SSE2 я такой не нашел.
P.S. Использую 64-битные числа.
Я конечно понимаю что числа храняться неточно, но не до такой-же степени!
До какой степени? 3.10(9) ≡ 3.11 математически. В числах с плавающей точкой будет погрешность в *надцатом знаке.
Кроме того, Вам-таки округлить надо или отбросить дробную часть?
Я конечно понимаю что числа храняться неточно, но не до такой-же степени!
До какой степени? 3.10(9) ≡ 3.11 математически.
Только в ЭВМ нет такого понятия как период.
В числах с плавающей точкой будет погрешность в *надцатом знаке.
Я специально сказал:
Я конечно понимаю что числа храняться неточно, но не до такой-же степени! Например, если число будет "3.11" и его домножить на "100", то в памяти будут положенные "311.0".
Кроме того, Вам-таки округлить надо или отбросить дробную часть?
В стандартных форматах точно могут храниться лишь числа вида N*2^M, где N и M - целые числа в определённых диапазонах, зависящих от формата. Ваши числа 3.1, 3.11, 0.11 в таком виде непредставимы и потому не могут храниться без погрешности. В двоичной системе они являются бесконечными периодическими дробями.
Вы утверждаете, будто с числом 3.1 всё в порядке. Нет, не всё в порядке. Видимо, способ, которым вы его просматриваете, округляет младшие разряды, чтобы "спрятать" погрешность; либо при конвертации в десятичную систему возникла другая ошибка, по счастливой случайности направленная в противоположную сторону.
Вы утверждаете, будто с числом 3.1 всё в порядке. Нет, не всё в порядке.
Я не утверждал, что число 3.1 храниться как 3.1, очевидно что нет. Я утверждал, что если 3.1 умножить на 10, а потом вывести на экран, он выведет 31.0, а не 30.999.
Я еще раз отмечу, что на FPU те-же 64-битные числа так не делали. Правда я для отделения дробной части использовал инструкцию для получения остатка от деления.