SSE2 Float-point

Модератор: Модераторы разделов

BratSinot
Сообщения: 812
ОС: Slackware64

SSE2 Float-point

Сообщение BratSinot »

Доброго времени суток!

Есть задача, отделить от 64-битного числа с плавающей точкой дробную часть. Я делаю это как-то так:

Код: Выделить всё

    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-битные числа.
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: SSE2 Float-point

Сообщение watashiwa_daredeska »

BratSinot писал(а):
19.09.2011 20:05
Я конечно понимаю что числа храняться неточно, но не до такой-же степени!
До какой степени? 3.10(9) ≡ 3.11 математически. В числах с плавающей точкой будет погрешность в *надцатом знаке.
Кроме того, Вам-таки округлить надо или отбросить дробную часть?
Спасибо сказали:
BratSinot
Сообщения: 812
ОС: Slackware64

Re: SSE2 Float-point

Сообщение BratSinot »

watashiwa_daredeska писал(а):
19.09.2011 21:37
BratSinot писал(а):
19.09.2011 20:05
Я конечно понимаю что числа храняться неточно, но не до такой-же степени!
До какой степени? 3.10(9) ≡ 3.11 математически.

Только в ЭВМ нет такого понятия как период.

В числах с плавающей точкой будет погрешность в *надцатом знаке.

Я специально сказал:
Я конечно понимаю что числа храняться неточно, но не до такой-же степени! Например, если число будет "3.11" и его домножить на "100", то в памяти будут положенные "311.0".


Кроме того, Вам-таки округлить надо или отбросить дробную часть?

Мне надо отбросить целую часть.

Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5427
ОС: Gentoo

Re: SSE2 Float-point

Сообщение /dev/random »

В стандартных форматах точно могут храниться лишь числа вида N*2^M, где N и M - целые числа в определённых диапазонах, зависящих от формата. Ваши числа 3.1, 3.11, 0.11 в таком виде непредставимы и потому не могут храниться без погрешности. В двоичной системе они являются бесконечными периодическими дробями.
Вы утверждаете, будто с числом 3.1 всё в порядке. Нет, не всё в порядке. Видимо, способ, которым вы его просматриваете, округляет младшие разряды, чтобы "спрятать" погрешность; либо при конвертации в десятичную систему возникла другая ошибка, по счастливой случайности направленная в противоположную сторону.
Спасибо сказали:
BratSinot
Сообщения: 812
ОС: Slackware64

Re: SSE2 Float-point

Сообщение BratSinot »

/dev/random писал(а):
20.09.2011 07:23
Вы утверждаете, будто с числом 3.1 всё в порядке. Нет, не всё в порядке.

Я не утверждал, что число 3.1 храниться как 3.1, очевидно что нет. Я утверждал, что если 3.1 умножить на 10, а потом вывести на экран, он выведет 31.0, а не 30.999.
Я еще раз отмечу, что на FPU те-же 64-битные числа так не делали. Правда я для отделения дробной части использовал инструкцию для получения остатка от деления.

Вообщем стоило заменить cvttsd2si на cvtsd2si.
Спасибо сказали: