Блог пользователя I_love_natalia

Автор I_love_natalia, история, 7 лет назад, По-русски

Недавно был раунд, на котором многие участники ловили проблемы из-за отсутствия 80-битной вещественной арифметики в Java. Меня интересует вопрос (ведь исследования наверняка проводились), как же правильно складывать положительные вещественные числа?

Для желающих проникнуться темой я написал несколько реализаций сложения и проверил их на нескольких известных примерах. Реализации следующие: сложение в порядке возрастания, сложение в порядке убывания (всегда самое плохое :) ), сложение случайной перестановкой с последующей рекурсией через сумму левой и правой половины и сложение по принципу построения кода Хаффмана (последнее в действительности очень хорошо, но медленно).

http://ideone.com/OZIvET сложение в 32-битных числах для ряда

http://ideone.com/3SG8qm сложение в 64-битных числах для ряда

http://ideone.com/cWAvck сложение в 64-битных числах с разбросом 10

http://ideone.com/TB0loz сложение в 64-битных числах с разбросом 10000

  • Проголосовать: нравится
  • +35
  • Проголосовать: не нравится

»
7 лет назад, # |
Rev. 2   Проголосовать: нравится +34 Проголосовать: не нравится

Знаю, что есть такая штука. Насколько она полезна — не знаю. )

  • »
    »
    7 лет назад, # ^ |
      Проголосовать: нравится +26 Проголосовать: не нравится

    Работает, забавно. Оказывается, я упустил, что нужно просто провести вычисления с удвоенной разрядной сеткой.

  • »
    »
    7 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    А вообще я подумал еще немного, надо изучать вопрос. Википедия разбирает возможную оптимизацию по ассоциативности, которую, конечно, ни один адекватный компилятор проводить не должен. Но есть еще одна оптимизация — оптимизация неусечения регистра. Она заключается в том, что заявленное как 64-битное число загружается в 80-битный регистр и вычисления проводятся в 80-битном режиме, а результат приводится в 64-битный тип только при выгрузке из регистра в память. Такая оптимизация сломает весь алгоритм, если промежуточный t не будет переведен в 64-битный тип перед вычислением с.

»
7 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Можно ссылку на задачу?