Для начала, отмечу ошибку в названии топика. Не 3*1/3, а 1/3*3, т.к. в первом случае получим ровно единицу.
В контексте той темы, автор* несёт совершенную, незамутнённую познаниями темы чушь. Ибо в той теме речь идёт о применении внутри американских военных ракет, а стало быть использовании в микроконтроллерах. Для микроконтроллеров массового производства не существует _адекватного_ решения данной задачи.
Для ПК это возможно. В частности, это можно решить путём создания класса для хранения числителя и знаменателя и операций с ними. Любая операция умножения будет приводить к умножению числителя, а любая операция деления - к умножению знаменателя. Желательно использование перегруженных операторов. В момент присваивания объекта данного класса числу через перегруженный оператор равенства, будет возвращён результат деления числителя на знаменатель. В случае умножения одного объекта данного класса на объект того же класса перемножаются числители и знаменатели друг с другом. В случае деления - числитель делимого умножается на знаменатель делителя, и наоборот. Приведённая архитектура класса весьма примитивна, существуют много лучшие решения. Но как незатейливое решение для конкретного круга задач вполне может сгодится.
*автор != топикстартер; автор == тот, кто задумал производить вычисления внутри микроконтроллера с бесконечной точностью.
Если перевести идею упомянутого оратора на великий и могучий, она состояла в том, чтобы перенести ответственность за обеспечение требуемой, в контексте выполнения текущей операции, точности с программиста на компилятор.
Вы сказали всё правильно, но вышеуказанную, в данном сообщении, задачу это не решает.
Цитирую, Вас же: «Точности четырех знаков после запятой на практике более чем достаточно чтобы ракета мимо не пролетела. К тому же что мешает представлять натуральные дроби в виде пары числе, если важна абсолютная точность? Ну кроме отсутствия мозгов.» Вот я и отвечаю, что в случае микроконтроллеров пару чисел адекватно на уровне языка нельзя представить вообще никак. Для ПК я описал как такой класс может выглядеть на плюсообразных языках.
«Точности четырех знаков после запятой на практике более чем достаточно чтобы ракета мимо не пролетела».
sqrt(sqrt(x))*something рассчитайте для случаев х = 0 и х = 0.0001
если три умножить на одну треть, то получиться единица. в любой системи счисления.
но вот если ты будешь юзать деситичные дроби (ну или их аналог для двоичной СИ), скажем. и если у тебя числа не вырязяться в твоих дробях, то резульатт будет примерно как в десятичных дробях, т.е. 0.(9) (как бы оно там не записывалось).
Для начала, отмечу ошибку в названии топика. Не 3*1/3, а 1/3*3, т.к. в первом случае получим ровно единицу.
я так понимаю вы из адептов секты которая от перемены мест множетелей получает другой результат? тут недавно вой был в интернетах что ваша секта у власти и детей в школе учит.. прогрессируете, блин, молодцы...
сэр, но вы ведь говорите о реализации целочисленной арифметике в языке c++ (в данном случае.и в данном случае будут использоваться на сколько я понимаю инструкции процессора). а автор топика задавал более абстрактный вопрос, согласитесь.
а автор топика задавал более абстрактный вопрос, согласитесь.
Позволю себе с Вами не согласиться. Цитирую автора топика: «Недавно тут где-то в срачах всплывало. Но от темы этой отошли.». В той теме, как раз «всплывало» не про абстрактную математику, а про прикладные вычисления внутри процессора, даже конкретно внутри микроконтроллера американской ракеты «Патриот». И то, что точность их действительно зависит от перемены мест операндов. Разумеется, автору темы следовало поподробнее описать, в чём заключается его вопрос.
я так полагаю, что в этом вопросе-таки нужно было подумать, прежде, чем умничать, потому что действия выполняются слева направо, и в первом случае мы при редукции получим 3/3, а во втором - (1/3)*3, где (1/3) - компьютерное представление числа 1/3.
если пройти по вашей ссылке, по поводу «с чего началось» то мы увидим утвержение
«Я уже вчера приводил пример: 3*⅓ < 1, если считать в двоичной системе, и если даже правильно округлять. И с этим ничего не поделать.»
я правда не полез искать где он приводил пример. наверное он действительно _имел ввиду_ машинные вычисления. но всё таки написал он не совсем корректно. 3*(1/3) = 1 в любой системе счисления с целым основанием (по крайней мере.. а может и с другими основаниями тоже). другой вопрос что есть машинные ограничения. это да. и зависит от представления числа и точности с которой мы можем считать, тоже да.
ну и далее, полагаю ТС интересовал просто процесс деления.. вроде того «а как это в двоичной троичка? она ж двоичная.. и как это разделить-то?», что в общем-то к машинным ограничениям и представлению числа имеет отношение весьма опосредованное. на этот вопрос я и отвечал. и на этот вопрос я и пошутил про вас и секту. может быть не совсем удачно.
но рассудить нас мне кажется может только ТС, что же он там на самом деле имел ввиду... :)
Артиллеристы всю жизнь пользуются заранее рассчитанными таблицами, и это лучший выход когда траекторию нужно считать быстро.
В общем ТСы по старой программистской традиции задачу начинают решать с конца, а потом удивляются результатам. А нужно задача->структура данных->алгоритм.
Если следовать математике. Математика имеет дело с бесконечной точностью дробей, в тоже время, понятие бесконечности с т.з. математики не имеет смысла, оно не достижимо. Ну вы поняли.
Перечитал. Соглашусь, вопрос спорный что и кто там имел в виду. В любом, случае, вопрос точности операций умножения и деления над числами в машинном представлении интересно рассмотреть с разных точек зрения)