Что первым идет вычитание или сложение: Какое из действий (умножение, деление, сложение или вычитание) нужно выполнить первым, определяя значение выражения (31⋅1−0):31+81…

Деление со скобками, что сначала, 36:3(8-6)/6, ответ на пример, как правильно делить

НовостиНаука

Фото
Александр Чатикян / «Вокруг света»

Уже несколько дней пользователи соцсетей по всему миру ломают головы над простым математическим примером. По соцсетям и интернет-форумам гуляет задача 36:3(8-6)/6. В зависимости от порядка действий можно получить ответ 1 или 4.

Коллеги из редакции NGS.RU решили подключить к решению профессионала и попросили прокомментировать пример кандидата физико-математических наук, доцента Новосибирского государственного университета Илью Марьясова. Итак, как делить со скобками?

По мнению преподавателя, здесь нет подвоха. Самое главное — твердо соблюдать порядок действий.

— Умножение и деление имеют более высокий приоритет, чем сложение и вычитание, — объяснил Илья Марьясов. — Когда нужно изменить порядок вычисления, чтобы сложение и вычитание выполнялись раньше, то используются скобки.

И еще один нюанс: когда появляются дроби, а дробная черта — это деление, то в этом случае оно выполняется в последнюю очередь.

Сначала нужно решить числитель. По очереди идут деление, умножение, вычитание — при этом последняя операция идет в скобках. Начинаем решать слева направо.

Итак, 36 делим на 3, получаем 12. Потом нужно выполнить умножение, но поскольку вычитание стоит в скобках, то сначала делаем его. Из 8 вычитаем 6, получаем 2. Теперь умножение. Мы 12 умножаем на 2 и получаем 24. Теперь делим числитель на знаменатель. То есть 24 делим на 6.

Правильный ответ — 4.

Дело в особенностях преподавания математики, считает Илья Марьясов.

— В начальном звене вводят операции — сложение, вычитание, умножении и деление, — рассказал специалист. — Примерно до 6-го класса дети не знают, что существуют рациональные числа, которые записываются в виде дробной черты. Когда они вводятся, то выясняется, что операцию деления можно записать не в виде двух точек.

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

В итоге это приводит к ошибке в решении нашумевшей задачи.

— У людей возникает соблазн 3 умножить на 8 минус 6 (то есть на 2) и получается у них 6. Потом 36 делят на 6, получая 6. И в итоге 6 делят на 6 и выходит 1. Это неверный ответ в данном случае, — подытожил Илья Марьясов.

Попробуйте также ответить на каверзный вопрос из собеседования у Стива Джобса, решить старинную задачу от Илона Маска и многоходовку о дожде в Сиэтле, которую приписывают Марку Цукербергу.

Все тесты «Вокруг света» собраны здесь.

По материалам NGS.RU.


Теги

  • Математика

Сегодня читают

Только до 1 из этих вишен не добрался голодный червяк: найдите ее, пока не поздно

Тест на тип личности: сожмите кулак, а мы расскажем о скрытых сторонах вашего характера

Где спрятался леопард? Тест на остроту зрения от фотографа дикой природы

«Священные земли с тысячелетней историей»: в Казахстане предложили переименовать еще 4 региона

Непростая зарядка для глаз: только 1 из 10 человек может найти на картинке все 12 предметов

c++ — Быстрее ли работают сложение/вычитание и битовые операции по сравнению с делением/умножением в SIMD?

Вопрос задан

Изменён 1 год 6 месяцев назад

Просмотрен 407 раз

Как известно, обычные инструкции сложения/вычитания и битовых сдвигов в процессорах x86 работают быстрее, чем инструкции умножения/деления. По-этому, для повышения производительности, операции *,/ как правило по возможности стараются заменить на +,-,>>,<<.

Мой вопрос: верно ли это утверждение для команд SIMD-расширений, как например SSE2? Или все инструкции SSE2 или другого расширения выполняются за равное количество тактов, а значит с заменой, скажем, операции деления на битовые сдвиги со сложениями можно не париться?

  • c++
  • x86
  • simd

Важно понимать, что:

  1. Современный компилятор достаточно умен и сообразителен, чтобы делать такие замены самостоятельно. Если вы делаете их вручную в ущерб читаемости кода просто в процессе написания, вы делаете только хуже. Потому что нечитаемый код может нанести экономических и репутационных потерь больше, чем гипотетические 2-3-5 процентов потери скорости, существование которых экспериментально не доказано.

  2. Прагматичный подход к оптимизации идет от лога профайлера, а не от того, что вы что-то где-то слышали от кого-то или даже читали, даже в учебнике, даже в именитом. Times, they are changing. Рекомендашки по ускорению устаревают раз в три года, а через пять лет покрываются плесенью. В олдскульных книжках, например, можно прочесть, что по массивам лучше ходить задом неперед из-за инструкции

    loop, которая отматывает регистр CX до нуля. Ага, советы из 80х, транслируемые преподами ВТУЗОВ студентам 2020х

  3. Время выполнения инструкции в современном конвейерном SIMD процессоре, который еще перегоняет у себя CISC в RISC внутри, зависит от большого сочетания факторов, которые теоретически трудно предсказать. Главными является ширина кэш-линий, число свободных каналов памяти, мгновенная тактовая частота, зависящая от режима энергопитания и температуры в данный момент времени (см. Turbo Boost и аналоги). Побочным может выступить такой фактор как внезапное попадание данных в другой NUMA-регион. Последним процессором, для которого можно было это четко узнать из мануала (была прямо табличка — опкод | число тактов) был не то i386, не то i486

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

3

Как известно, обычные инструкции сложения/вычитания и битовых сдвигов в процессорах x86 работают быстрее, чем инструкции умножения/деления.

Это скорее бабушка на двое сказала. Во-первых, «обычные инструкции» — это на самом деле целое семейство инструкций. Которые еще и по-разному реализованы в разных процессорах. Во-вторых, в целом у них сходная производительность (если мерять в тактах), в каких-то вариантах может быть быстрее допустим умножение, а в других сдвиг.

Например (для Sandy Bridge) IMUL m 2 CPI, SHL m,cl 4 CPI. При этом SHL r,i 0.5 CPI, а IMUL r,i 1 CPI. Для MMX psllw mm, mm и pmullw mm, mm — 1 CPI. Для SSE vpsllw ymm, ymm, xmm 1 CPI, а вот vpmulhw ymm, ymm, ymm на Skylake 0.5 CPI, а на более ранних те же 1 CPI. Вот деление да, оно гарантировано медленнее, там десятки CPI. В-третьих, собственно скорость вычисления в тактах — это далеко не единственная и не самая важная характеристика производительности инструкций. Если заглянуть в каталог таких характеристик, то там глаза разбегаются. В-четвертых, сложное устройство конвейера в современных процессорах также вносит свою лепту в определение производительности тот или иной инструкции, ведь реальная производительность варьируется в зависимости от состояния конвейера. Например идущие подряд 6-байтовые инструкции будут вызывать дополнительный простой.

Что касается парится или нет — парится надо, но делать это надо системно, а не пытаться сэкономить байты разбрасывая хитрые вставки в коде.

Зарегистрируйтесь или войдите

Регистрация через Google

Регистрация через Facebook

Регистрация через почту

Отправить без регистрации

Почта

Необходима, но никому не показывается

Отправить без регистрации

Почта

Необходима, но никому не показывается

Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими пользовательским соглашением, политикой конфиденциальности и политикой о куки

Порядок действий – Элементарная математика

Уменьшение двусмысленности по договоренности

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

Означает ли 10 − 5 − 3, что мы начинаем с 10, вычитаем 5, а затем вычитаем еще 3, оставляя 2? Или это означает, что мы вычитаем 5 − 3 из 10?
Равно ли 2 + 3 × 10 50, потому что 2 + 3 равно 5, а затем мы умножаем на 10, или автор имеет в виду, что мы добавляем 2 к результату 3 × 10?

Чтобы избежать этих и других возможных неясностей, математика установила соглашения (соглашения) о том, как мы интерпретируем математические выражения. Одно из этих соглашений гласит, что когда все операции одинаковы, мы действуем слева направо, поэтому 10 — 5 — 3 = 2, поэтому автору, который хотел бы другую интерпретацию, пришлось бы писать выражение по-другому: 10 — (5). − 2). Когда операции не такие, как в 2 + 3 × 10, некоторым может быть отдано предпочтение перед другими. В частности, умножение выполняется перед сложением независимо от того, какое из чисел появляется первым при чтении слева направо. Например, в 2 + 3 × 10 умножение должно быть выполнено первым, даже несмотря на то, что оно стоит справа от сложения, а выражение означает 2 + 30.
Полные правила порядка операций см. ниже.

Условные обозначения для чтения и записи математических выражений

Основной принцип: «более мощные» операции имеют приоритет над «менее мощными».

Использование числа в качестве показателя степени (например, 58 = 390625) имеет, как правило, «самый сильный» эффект; использование того же числа в качестве множителя (например, 5 × 8 = 40) дает более слабый эффект; сложение имеет, как правило, самый «слабый» эффект (например, 5 + 8 = 13). Хотя эти термины (мощный, слабый) в математике не употребляются, смысл сохраняется в языке «возведение 5 в 8-ю степень». Возведение в степень «мощно», поэтому оно на первом месте! Сложение/вычитание «слабые», поэтому они идут последними. Умножение/деление находится между ними.

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

Например, хотя 2 + 3 × 8 означает то же, что и 2 + 24 (поскольку умножение имеет приоритет и выполняется первым), (2 + 3) × 8 означает 5 × 8, поскольку (2 + 3) пакетное предложение, количество, которое необходимо выяснить перед его использованием. На самом деле (2 + 3) × 8 часто произносится как «два плюс три, количество, умноженное на восемь» (или «количество два плюс три, умноженное на восемь»).

Краткое изложение правил:

  • Сначала скобки. Обращение к ним как к «пакетам» часто помогает детям вспомнить их цель и роль.
  • Экспоненты рядом.
  • Далее умножение и деление. (Ни один из них не имеет приоритета, и когда они идут последовательно, они выполняются слева направо.)
  • Сложение и вычитание в последнюю очередь. (Опять же, ни один из них не имеет приоритета, и последовательная строка из них выполняется слева направо.)

Распространенные заблуждения

Многие учащиеся изучают порядок операций, используя PEMDAS (скобки, возведения в степень, умножение, деление…) в качестве вспомогательного средства для запоминания. Это очень часто приводит к ошибочному представлению о том, что умножение предшествует делению, а сложение предшествует вычитанию. Понимание этого принципа, вероятно, является лучшим помощником в запоминании.

арифметика — Имеет ли значение порядок операций только сложения и вычитания?

Задавать вопрос

спросил

Изменено 5 лет, 4 месяца назад

Просмотрено 29 тысяч раз

$\begingroup$

Спорили, можно ли выполнять сложение/вычитание в любом порядке. В частности, для следующего:

$9- 4 + 3$

Мы оба согласны с тем, что ответ равен 8.

Я утверждаю, что если придать сложению более высокий приоритет, чем вычитанию (а не тот же приоритет и двигаться слева направо), вы получите $9 — 4 + 3 = 9 — 7 = 2$, что является неправильным ответом, и поэтому важно, чтобы сложение и вычитание имели одинаковый приоритет.

Другой человек утверждает, что порядок операций не имеет значения и что их можно выполнять в любом порядке, поскольку, если сложение имеет более высокий приоритет, чем вычитание, вы получите 9 долларов.- 4 + 3 = 9 + (-4 + 3) = 9 + — 1 = 8$, что является правильным ответом, и поэтому не имело бы значения, если бы сложение/вычитание имело разные приоритеты, а не одинаковые.

Я утверждаю, что внесение $- 4$ в скобку и последующее выполнение до $+ 3$ не было бы выполнено, если бы сложение имело более высокий приоритет. Довольно длинные дебаты можно увидеть здесь, если вы хотите их прочитать, поэтому я не перефразирую все это и не слишком предвзято отношусь к своей стороне.

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

  • арифметика

$\endgroup$

$\begingroup$

Уточним:

$$9 — 4 + 3 \color{red}{\ne} 9 — (4 + 3) \tag{1}$$

Похоже, вы путаете, что значит группировать вместе , или связать, операции.

  • Да, сложение и вычитание коммутативны : Операции можно выполнять в любом порядке.
  • Да, сложение и вычитание ассоциативны : Термины могут быть сгруппированы в любом порядке перед выполнением операций.

НО , ошибка в приведенном выше выражении $(1)$ заключается в том, что термины не были правильно сгруппированы. Правильный способ связать два последних термина:

$$\begin{align*}9 — 4 + 3 &= 9 + (-4 + 3) \tag{2}\\ &=9-(4-3) \end{align*}$$

В исходном выражении $(1)$ вверху этого поста вы ввели второй знак минус.

$$\цвет{красный}{9- (4 + 3) = 9 — 4 — 3} \tag{3}$$

Итак, нет двусмысленности в том, что означает $(2)$ или $(3)$. Но они означают совершенно разные вещи. Скобки, используемые для группировки в этом примере, должны соответствовать мультипликативному свойству распределения. Если мы по желанию вставим скобки в математическое выражение, то рискуем полностью изменить результаты. Чтобы правильно сгруппировать элементы, мы должны убедиться, что наш результат передает одно и то же сообщение — тот же порядок операций.

$\endgroup$

11

$\begingroup$

Нет, они выполняются одновременно. 9 долларов — (4+3) = 9 — 7 = 2 доллара. Сложение/вычитание — это двоичная операция между и двумя числами . Таким образом, когда мы говорим $a + b + c$, мы имеем в виду $a + (b + c)$ или $(a + b) + c$. Обратите внимание, что для сложения они одинаковы, поскольку + является «ассоциативным» (это определение ассоциативности). Поэтому мы просто пишем $a + b + c$, так как это однозначно. Обратите внимание, что $a — b$, по сути, является сокращением для $a + (-b)$. То же самое верно для умножения, но не для деления.

$$ (8/4)/2 = 2 / 2 = 1; \ 8/(4/2) = 8/2 = 4. $$

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

$\endgroup$

8

$\begingroup$

Я бы сказал, что порядок (сложения/вычитания) не имеет значения, И вам не нужно повышать «приоритеты», пока вы понимаете, что вычитание — это просто сложение отрицательных чисел…

Итак, 9 — 4 + 3 — это не 9 — (4 + 3), а 9 + ( -4 + 3 ).

Знак «минус» перед скобками подразумевает, что вы хотите сделать все внутри отрицательным, а это не то, чего мы на самом деле хотели.

Так что просто сделайте все числом со знаком и выполняйте все процессы как сложение в том порядке, в котором вам легче всего.

$\endgroup$

$\begingroup$

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

admin

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *