Pull to refresh

Comments 25

Лучше уж сразу назвать серию постов «Алгоритмы древнего Вавилона»
UFO just landed and posted this here
Хорошо. Ничего критичного для жизни людей не программирует.
while(fabs(a-b)<EPS) тут наверное обратное условие,
преобразуем, пока разница между сторонами больше ε?
Точно! Очень извиняюсь! Спасибо! Исправил
Ожидал увидеть очередную статью про 0x5f3759df.
Раз уж решили искать корень перебором, почему бы обычную дихотомию не использовать? Или бином Ньютона, на худой конец.
По-моему это называется итерационный аналитический алгоритм извлечения квадратного корня на основе формулы Герона.
А можете объяснить почему стандартный sqrt,

sqrt13:
double sqrt13(double n)
{
   __asm {
     fld n
     fsqrt
   }
}   


и sqrt14

double inline __declspec (naked) __fastcall sqrt14(double n)
{
	_asm fld qword ptr [esp+4]
	_asm fsqrt
	_asm ret 8
} 


работают разное время? Каждый следующий раза в два быстрее предыдущего (при этом точность одинаковая).

Очень уж не хочется верить в то, что в наши дни нужно писать код как в примере 14, который судя по всему ещё не будет работать на x64. Как-то я больше доверял оптимизациям компилятора.
Ну по идее обе функции должны бы заинлайниться. Да и пролог/эпилог хороший компилятор должен сам суметь решить когда выкинуть.

анализировать __asm{} блок компилятору запрещено. именно поэтому 13й вариант имеет все необходимые стандартные заголовки и не имеет права инлайниться — мало ли что ты там в asm{} блоке хочешь делать.

кстати, 14й тоже НЕ инлайнится, несмотря на __inline. иначе функция работала бы СОВСЕМ неправильно из-за ret 8 унутре
А я ожидал увидеть алгоритмы для компьютеров — быстрые, с маленькой погрешностью, эффективные.
У автора после while фигурных скобок не хватает :)
И ещё вдогонку, в приведённой функции после того как поставить скобки после условия в while, всё разно есть ещё одна ошибка,
Она связана с неучтённой погрешностью float.

Вход 1e18: codepad.org/qK4Bs558 — выполняется
Вход 1e20: codepad.org/7Rwyo0ghбесконечный цикл
Вход 1e22: codepad.org/Ry9iRGbZ — выполняется
У меня при компиляции на gcc все представленные входы нормально считаются. Там float какого размера используется?
4 байта.
Проявление этой ошибки зависит от инструкций и их порядка. И будет скорее всего разное при разных настройках компилятора.
Можешь попробовать повычислять с числами такого же порядка, в цикле.
Sign up to leave a comment.

Articles