Пожалуйста подскажите, как реализовать следующую задачу на ВС++. Необходимо не терять младшие биты при умножении чисел типа double. Мантисса дабловских чисел состоит из 52 битов. То есть, если все 52 бита значящие, то при умножении последние 26 отбросятся, чтобы результат поместился в 52.
Я пытался разбить число double на 2 числа double, у первого занулял 26 младших битов, у старшего 26 старших. При умножении получаю 2 числа первое=результату умножения чисел с нулевыми младшими битами, второе=сумме результатов умножений вторая часть 1-го числа (нулевые старшие биты) на первую часть 2-го числа (нулевые младшиешие биты) + первая часть 1-го числа на вторую часть второго числа. Затем складываю эти результаты и вроде бы должен получаться правильный ответ. К сожалению нет

Вот код:
union DoubInt
{
double d;
__int64 i;
};
DoubInt A,B,D;
A.d = x; //данное число
D.i = A.i;
B.i = (A.i >> k) << k; //k — сдвиг
main = B.d; //главная часть
A.i -= B.i;
i = D.i;
j = i>>52;
l = j<<52;
D.i = l;
A.i += D.i;
tail = A.d; //остаток
Здравствуйте, Truant, Вы писали:
T>Пожалуйста подскажите, как реализовать следующую задачу на ВС++. Необходимо не терять младшие биты при умножении чисел типа double. Мантисса дабловских чисел состоит из 52 битов. То есть, если все 52 бита значящие, то при умножении последние 26 отбросятся, чтобы результат поместился в 52.
T>Я пытался разбить число double на 2 числа double, у первого занулял 26 младших битов, у старшего 26 старших. При умножении получаю 2 числа первое=результату умножения чисел с нулевыми младшими битами, второе=сумме результатов умножений вторая часть 1-го числа (нулевые старшие биты) на первую часть 2-го числа (нулевые младшиешие биты) + первая часть 1-го числа на вторую часть второго числа. Затем складываю эти результаты и вроде бы должен получаться правильный ответ. К сожалению нет
Вот код:
T> union DoubInt
T> {
T> double d;
T> __int64 i;
T> };
T> DoubInt A,B,D;
T> A.d = x; //данное число
T> D.i = A.i;
T> B.i = (A.i >> k) << k; //k — сдвиг
T> main = B.d; //главная часть
T> A.i -= B.i;
T> i = D.i;
T> j = i>>52;
T> l = j<<52;
T> D.i = l;
T> A.i += D.i;
T> tail = A.d; //остаток
Это в алгоритмы надо. Ключевое слово "арифметика многократной точности"
Попробуй посмореть вот это сообщение
http://www.rsdn.ru/Forum/Message.aspx?mid=2265630&only=1Автор: WW_
Дата: 15.12.06
в форуме "Алгоритмы"
Спасибо за ссылки, жаль не помогли. Мне нужен пример или программа такого типа или литература, которая бы помогла разобраться в том, как устроена эта машинная арифметика. До сих пор, к примеру, не понял нормализуется ли разность после вычитания двух чисел, если старшие биты становятся нулями.