LINUX.ORG.RU

Зависит от того, как хранить числа.

PolarFox ★★★★★ ()

Она и в десятичной может не получиться.

Xellos ★★★★★ ()

как в двоичной системе выполнить операцию 3*1/3 ?

Перемножить числители, найти НОД, разделить?

Sadler ★★★ ()
Последнее исправление: Sadler (всего исправлений: 1)
Ответ на: комментарий от Sadler

А как в двоичной можно представить число «одна третья» ?

dk- ()
Ответ на: комментарий от dk-

А как в двоичной можно представить число «одна третья» ?

Как 1 и 3.

Sadler ★★★ ()
Ответ на: комментарий от dk-

А как его представить (по твоей логике) в десятичной?

Kosyak ★★★★ ()

(11)^(1)*(11)^(-1) = 11^(1-1) = 11^(0) = 1

/thread

wisp ★★ ()

Для начала, отмечу ошибку в названии топика. Не 3*1/3, а 1/3*3, т.к. в первом случае получим ровно единицу.

В контексте той темы, автор* несёт совершенную, незамутнённую познаниями темы чушь. Ибо в той теме речь идёт о применении внутри американских военных ракет, а стало быть использовании в микроконтроллерах. Для микроконтроллеров массового производства не существует _адекватного_ решения данной задачи.

Для ПК это возможно. В частности, это можно решить путём создания класса для хранения числителя и знаменателя и операций с ними. Любая операция умножения будет приводить к умножению числителя, а любая операция деления - к умножению знаменателя. Желательно использование перегруженных операторов. В момент присваивания объекта данного класса числу через перегруженный оператор равенства, будет возвращён результат деления числителя на знаменатель. В случае умножения одного объекта данного класса на объект того же класса перемножаются числители и знаменатели друг с другом. В случае деления - числитель делимого умножается на знаменатель делителя, и наоборот. Приведённая архитектура класса весьма примитивна, существуют много лучшие решения. Но как незатейливое решение для конкретного круга задач вполне может сгодится.

*автор != топикстартер; автор == тот, кто задумал производить вычисления внутри микроконтроллера с бесконечной точностью.

next_time ★★★★ ()

Получится ли единица?

В нормальном ЯП - да

DNA_Seq ★★☆☆☆ ()
Ответ на: комментарий от next_time

Для микроконтроллеров массового производства не существует _адекватного_ решения данной задачи.

Адекватный вариант - избегать деления при работе с целыми числами. Если вещественные числа микроконтроллер не умеет, пользоваться готовыми таблицами.

DNA_Seq ★★☆☆☆ ()
$ sbcl
* (* 1/3 3)
1
* (* 3 1/3)
1
* 1/3
1/3

Усе работает=)

Deleted ()
Ответ на: комментарий от DNA_Seq

Если перевести идею упомянутого оратора на великий и могучий, она состояла в том, чтобы перенести ответственность за обеспечение требуемой, в контексте выполнения текущей операции, точности с программиста на компилятор.

Вы сказали всё правильно, но вышеуказанную, в данном сообщении, задачу это не решает.

next_time ★★★★ ()
Ответ на: комментарий от Deleted

Молодец. А теперь, запусти это на микроконтроллере. Или, хотя бы, используй это в сколько-нибудь серьёзной библиотеке для рассчёта физики.

next_time ★★★★ ()

как в двоичной системе

Вангую, что вопрос на самом деле звучит как «Как в конечной машинной арифметике... »

buddhist ★★★★★ ()
Ответ на: комментарий от DNA_Seq

Адекватный вариант - избегать деления при работе с целыми числами. Если вещественные числа микроконтроллер не умеет, пользоваться готовыми таблицами.

Это всё подразумевается. Речь о ситуации, когда упёрлось проводить деления. О надежности ПО (комментарий)

Цитирую, Вас же: «Точности четырех знаков после запятой на практике более чем достаточно чтобы ракета мимо не пролетела. К тому же что мешает представлять натуральные дроби в виде пары числе, если важна абсолютная точность? Ну кроме отсутствия мозгов.» Вот я и отвечаю, что в случае микроконтроллеров пару чисел адекватно на уровне языка нельзя представить вообще никак. Для ПК я описал как такой класс может выглядеть на плюсообразных языках.

«Точности четырех знаков после запятой на практике более чем достаточно чтобы ракета мимо не пролетела».

sqrt(sqrt(x))*something рассчитайте для случаев х = 0 и х = 0.0001

next_time ★★★★ ()

если три умножить на одну треть, то получиться единица. в любой системи счисления.

но вот если ты будешь юзать деситичные дроби (ну или их аналог для двоичной СИ), скажем. и если у тебя числа не вырязяться в твоих дробях, то резульатт будет примерно как в десятичных дробях, т.е. 0.(9) (как бы оно там не записывалось).

AndreyKl ★★★★★ ()
Последнее исправление: AndreyKl (всего исправлений: 1)
Ответ на: комментарий от next_time

Для начала, отмечу ошибку в названии топика. Не 3*1/3, а 1/3*3, т.к. в первом случае получим ровно единицу.

я так понимаю вы из адептов секты которая от перемены мест множетелей получает другой результат? тут недавно вой был в интернетах что ваша секта у власти и детей в школе учит.. прогрессируете, блин, молодцы...

AndreyKl ★★★★★ ()
Ответ на: комментарий от AndreyKl

Да вы что.

int a, b, c; cin>>a>>b; a = b/a; cin>>c; c = a*c; cout<<с<<endl;

А теперь, угадайте, что будет если ввести сначала {3,3,1}

И что будет, если ввести {3,1,3}

Внезапно, разработчики компиляторов микропроцессоров оказались втянутыми в ту же самую секту.

next_time ★★★★ ()
Ответ на: комментарий от next_time

Для флоатов: {3.00001, 1 , 3.00001}. На выходе получаем: 0.99999994039535522461

cout.precision(20); только не забудьте добавить. А то сохранится иллюзия, что всё работает правильно.

next_time ★★★★ ()
Ответ на: комментарий от next_time

сэр, но вы ведь говорите о реализации целочисленной арифметике в языке c++ (в данном случае.и в данном случае будут использоваться на сколько я понимаю инструкции процессора). а автор топика задавал более абстрактный вопрос, согласитесь.

AndreyKl ★★★★★ ()
Ответ на: комментарий от AndreyKl

а автор топика задавал более абстрактный вопрос, согласитесь.

Позволю себе с Вами не согласиться. Цитирую автора топика: «Недавно тут где-то в срачах всплывало. Но от темы этой отошли.». В той теме, как раз «всплывало» не про абстрактную математику, а про прикладные вычисления внутри процессора, даже конкретно внутри микроконтроллера американской ракеты «Патриот». И то, что точность их действительно зависит от перемены мест операндов. Разумеется, автору темы следовало поподробнее описать, в чём заключается его вопрос.

Если интересно с чего оно началось, см. ссылку О надежности ПО (комментарий)

next_time ★★★★ ()
Ответ на: комментарий от AndreyKl

я так полагаю, что в этом вопросе-таки нужно было подумать, прежде, чем умничать, потому что действия выполняются слева направо, и в первом случае мы при редукции получим 3/3, а во втором - (1/3)*3, где (1/3) - компьютерное представление числа 1/3.

cdshines ★★★★ ()

Нет, не отошли. Сходи перечитай, фотограф.

aedeph_ ★★ ()
Ответ на: комментарий от next_time

если пройти по вашей ссылке, по поводу «с чего началось» то мы увидим утвержение

«Я уже вчера приводил пример: 3*⅓ < 1, если считать в двоичной системе, и если даже правильно округлять. И с этим ничего не поделать.»

я правда не полез искать где он приводил пример. наверное он действительно _имел ввиду_ машинные вычисления. но всё таки написал он не совсем корректно. 3*(1/3) = 1 в любой системе счисления с целым основанием (по крайней мере.. а может и с другими основаниями тоже). другой вопрос что есть машинные ограничения. это да. и зависит от представления числа и точности с которой мы можем считать, тоже да.

ну и далее, полагаю ТС интересовал просто процесс деления.. вроде того «а как это в двоичной троичка? она ж двоичная.. и как это разделить-то?», что в общем-то к машинным ограничениям и представлению числа имеет отношение весьма опосредованное. на этот вопрос я и отвечал. и на этот вопрос я и пошутил про вас и секту. может быть не совсем удачно.

но рассудить нас мне кажется может только ТС, что же он там на самом деле имел ввиду... :)

AndreyKl ★★★★★ ()
Последнее исправление: AndreyKl (всего исправлений: 3)

вообще, ТС, дели в столбик... как в школе учили.. н-р:

пусть надо 3 разделить на 3 (пользуемся тем что именно это и написано когда пишут 3*1/3), тогда дело идёт так. итого 1.

 11 |11
-11 _____
--- |1
  0

или более сложный пример

 1101 |10
-10   _____
---   |110,1
  10
 -10
 ---
   010
   -10
   ---
     0

вроде так, если ничего не попутал :)

AndreyKl ★★★★★ ()
Последнее исправление: AndreyKl (всего исправлений: 2)

А с каких это пор 3*1/3 это «три умножить на одну треть»?

Порядок выполнения арифметических операций в 1 или во 2 классе школы проходят. Это будет «три умножить на единицу и результат разделить на три».

ansky ★★★★★ ()
Ответ на: комментарий от dk-

Одна треть имелась ввиду как сущность.

Это не сущность, а обычное рациональное число

frame ★★★ ()
Ответ на: комментарий от frame

не придирайся. я о том, что это не «три умножить на единицу и результат разделить на три»

dk- ()
Ответ на: комментарий от AndreyKl

я так понимаю вы из адептов секты которая от перемены мест множетелей получает другой результат?

В питоне будет разный:

1/3*3

0

3*1/3

1

1/3*3.0

1.0

1/3*3.0

0.0

1/3.0*3

1.0
А вот перл считает правильно.

DNA_Seq ★★☆☆☆ ()
Последнее исправление: DNA_Seq (всего исправлений: 2)
Ответ на: комментарий от next_time

Артиллеристы всю жизнь пользуются заранее рассчитанными таблицами, и это лучший выход когда траекторию нужно считать быстро.

В общем ТСы по старой программистской традиции задачу начинают решать с конца, а потом удивляются результатам. А нужно задача->структура данных->алгоритм.

DNA_Seq ★★☆☆☆ ()
Ответ на: комментарий от next_time

Для начала, отмечу ошибку в названии топика. Не 3*1/3, а 1/3*3, т.к. в первом случае получим ровно единицу.

если следовать математике, то и во втором тоже

zikasak ★★ ()
Ответ на: комментарий от next_time

«Точности четырех знаков после запятой» нехватит даже обычным кварцевым часам чтобы держать хотя бы точность в 1с за сутки

n_play ()
Ответ на: комментарий от dk-

...которое что? Правильно, является рациональным, со всеми вытекающими =)

frame ★★★ ()
Ответ на: комментарий от zikasak

Если следовать математике. Математика имеет дело с бесконечной точностью дробей, в тоже время, понятие бесконечности с т.з. математики не имеет смысла, оно не достижимо. Ну вы поняли.

next_time ★★★★ ()
Ответ на: комментарий от n_play

Это не мне надо разъяснять, а DNA_Seq-у, я-то как раз и приводил пример, почему её может быть недостаточно.

next_time ★★★★ ()
Ответ на: комментарий от AndreyKl

Перечитал. Соглашусь, вопрос спорный что и кто там имел в виду. В любом, случае, вопрос точности операций умножения и деления над числами в машинном представлении интересно рассмотреть с разных точек зрения)

next_time ★★★★ ()
Ответ на: комментарий от next_time

должен согласиться с вашей аргументацией, действительно интересно :)

AndreyKl ★★★★★ ()
Ответ на: комментарий от next_time

понятие бесконечности с т.з. математики не имеет смысла

Вот и до Кантора добрались, теперь и он электричество вырабатывает...

Xellos ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.