У тех кто не умеет считать правильно - естетственно калькуляторы врут.
Кто не понимает как погрешности считаются.
Борис Бикул, ты не прав.
Не нужно пытаться оспорить преимущество целочисленной арифметики в этих вещах, уж поверь мне на слово.
Но если все ж не веришь -то смотри.
Как ты быстрее всего посчитаешь следующее выражение: 125*1*1*1*1*1*1*1*1*1?
Выполнишь все умножения или сразу скажешь, что это будет 125?
Наверное второе, да? Потому что ты знаешь, что умножение на единицу результата не меняет.
А как сделает компьютер? Он все перемножит. А если извращенец программист будет следовать твоим советам и добавит перед каждым умножением проверку "а не на единицу ли мы умножаем", то тогда компьютер конечно тоже получит верный результат. Но практически наверняка сделает это МЕДЛЕННЕЙ, чем если бы просто все перемножил.
Потому если начать извращаться и следовать всем твоим советам -то:
1) Код вопреки твоим ожиданиям потеряет наглядность. Так как хотя извлечение корня и будет выполнятся одной операцией, но к нему добавятся маловразумительные проверки на количество значащих цифр.
2) Все будет работать медленней. Потому что целочисленная арифметика -она очень быстрая. И 7-кратное повторение цикла для достижения точности в 1/100 (а больше 7 раз при методе бисекции не потребуется, так как 2^7=128, а это больше 100) - это мелочь по сравнению с тем как будет работать арифметика с плавающей точкой на некоторых машинах.
3) И самое главное, о чем тебе говорит Бальтазар: на некоторых машинах появятся ошибки! Не знаю, помнят ли еще историю с самыми первыми пентиумами, которые неправильно выполняли деление с плавающей точкой (что не мешало этим процессорам вполне успешно функционировать во многих домашних ПК) - но я не могу исключить ее повторение. Так как если проц твоего смартфона из-за дефекта дизайна считает, что квадратный корень из 10 это например 3,82587963 , то никакой учет числа значащих цифр делу не поможет.
А вот процессор, неправильно выполняющий целочисленные операции сразу идет в утиль. Так как такие грубые ошибки ни один тест не пропустит.
Ты в курсе что if можно на switch case заменить тогда в таком варианте и никаких if по факту не будет в плане сравнения чисел?
Как в бейсике можно было вместо if заменить на go to число в номер строки, и тоже экономилось дофига тактов, не надо было делать сравнение чисел?
Механизм примерно такой же, не обязательно сравнения делать именно сравнениями, а вот эти ваши докапывания что нецелочисленные операции совсем не обязательно их реально делать нецелочислеными.
Кто мешает целочисленно считать корень?
Можно хоть в уме считать, для этого есть таблица:
"Для этого прежде всего нужно выучить кубы чисел от 1 до 10:"
Если сделать поиск соответствия по таблице через методы при которых сравнение не требуется, например создать перед вычислениями массив где по индексу берется его целочисленный корень тот самый, то быстрее считать будет просто не возможно.
То есть в данном примере:
a[1]=1
a[2]=1
...
a[7]=1
a[8]=2
a[9]=2
...
Причем массив заранее заполнять через циклы а не if (что тоже выполняется быстрее, пояснение для тупых, мало ли)
От 1 до 7, потом от 8 до 27 и т.д. до числа кубический корень которого равен 100
То есть задать вначале один массив из 100 чисел, а по нему сформировать при запуске программы второй массив, только один раз.
Всего пара строчек кода, которые тоже выполняются молниеносно - и готовый шустрый массив вычисления кубических корней.
Просто по операции разыменования то есть по указателю + сдвиг ты сразу получаешь из оперативной памяти этот долбаный целочисленный кубический корень, быстрее методов тупо нет.
Мегабайт оперативки правда нужен, на это сжопится?
Ах да, конечно я число до целых округлил, а это так капец стало трудно понятно.
"к нему добавятся маловразумительные проверки на количество значащих цифр."
Во первых это надо сделать всего один раз, разобраться до скольки округлить и всё.
Маловразумительные? Это для того кто не понимает как калькулятор считает потому что привык что у него всегда много цифр в конце, а считать с учетом погрешности и округлений, его не учили?
Никому не сложно просто взять и убрать дробную часть.
Если нет дробной части какие еще дробные вычисления?
Так вот такой вариант будет работать еще быстрее ваших бисекций 7кратных.
Это конкретно для корня этого вашего целочисленного.
Можно так же составить массив из которого брать процент всей формулы от сложности, и при этом она будет соответствовать формуле нормальной, а работать такой массив будет еще быстрее.
Да, будет требовать больше памяти, но кто сейчас на это обращает внимание? Кроме того возможно если использовать другую структуру данных вместо массива то можно и скорость сохранить такую же и памяти лишней не использовать.
Вот сейчас взять и прикинуть для каких именно сложностей от и до чему равен этот долбаный целочисленый процент по формуле.
И вот эти цифры сложности округленные вниз до какой-то величины и добавить в циклы составления массива.
Человеку наглядно будет более чем алгоритм ваш с бисекциями.
Он тупо увидит от сложности ХХХ до сложности ХХХ процент забивается равным 30, менее сложность - будет 29 и т.д.
Куда уж наглядней? И людям вместе с формулой еще и таблицу давать, чтобы еще более наглядно было.
А вычисления такой метод только ускорит.
Но зачем понятное людям таблица и формула?
Мы же лучше сделаем сложные для расчета человеком без компа циклом с бисекциями, мудачьтесь придурки, мы вам усложнгили и вы дрочитесь теперь чтобы прикинуть когда следущее снижение будет, да?
Тут лохов не держат, да? Тут всё вычисляется циклом а не формулами? Чтобы вы все нае*лись с подсчетами этого всего если не хотите в программах считать или в математических пакетах, да?
Ты вот сам выше объясняя человеку как это правильно считать на калькуляторе не осознал что человеку без программы трудно это взять и посчитать на калькуляторе? Нет?
Куда было бы проще если бы была готовая таблица?
Может хоть на эту бисекцию можно составить готовую таблицу?
Если уж функция не задается формулой, то может хотя бы таблицу можно составить?
Или графиком ее описать?
"Как ты быстрее всего посчитаешь следующее выражение: 125*1*1*1*1*1*1*1*1*1?
Выполнишь все умножения или сразу скажешь, что это будет 125?
Наверное второе, да? Потому что ты знаешь, что умножение на единицу результата не меняет.
А как сделает компьютер? Он все перемножит. А если извращенец программист будет следовать твоим советам и добавит перед каждым умножением проверку "а не на единицу ли мы умножаем", то тогда компьютер конечно тоже получит верный результат. Но практически наверняка сделает это МЕДЛЕННЕЙ, чем если бы просто все перемножил."
Я этого не предлагал вообще, это выдумки.
Это как раз бисекция ваша, там не с сравнениями ли работает что там куда меньше куда больше?
Я предлагал считать округлив до целочисленного чтобы ну никак дробной математики не выходило.
Так как результат вычислений уже округлен , а считается из еще больших цифр сложности, короче там вполне в той формуле можно всё округлить до того что будет целочисленная математика без наворотов с бисекциями. Об этом и говорилось.