-3

У нас 250500 * 250500 = 62 570 250 000. Как мы можем представить это, используя низкие и высокие? Я знаю, что наибольшее число, которое можно представить в 32 битах, составляет 4 294 967 295 (2 ^ 32 - 1)

2 ответа2

2

В двоичном виде 250500 * 250500 = 62 570 250 000 выглядит следующим образом:
0011 1101 0010 1000 0100 * 0011 1101 0010 1000 0100 =
0110 1001 1100 0011 0100 1101 0100 0001 0000

Твердые математические правила гласят, что вы можете поместить результаты 18-битного числа, умноженного на 18-битное число, в 36 бит. Твердые правила математики гласят, что вы не можете обязательно уменьшить биты от сжатия, поэтому есть некоторые ограничения, с которыми вам, возможно, придется иметь дело.

Тем не менее, могут быть некоторые варианты.

Компьютер может быть использован для отслеживания метров ... или километров.
Если вы отслеживали концепцию 50 километров, это практически то же самое, что отслеживать 50000 метров.
Аналогично, вместо отслеживания 250500 * 250500 = 62 570 250 000 (то есть 250 500 единичных единиц x 250 500 единичных единиц), вы можете отслеживать десятичные единицы, например, 25050x25050 = 627 502 500 (250 500 дека-единиц x 250 500 дека-единиц = 627 502 500 квадратных дека -единицы). Число 627 502 500 будет соответствовать 32-битному слову.

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

Возможно, вместо отслеживания дека-единиц (которые представляют собой группы из 10 единиц), вы можете отслеживать группы единиц, которые имеют разный размер, например, группы из 500 единиц. Концепция заключается в том, что если вы знаете, что ваши числа всегда будут четными, то вы можете разделить числа на два и, возможно, на меньшие единицы. (Хотя вам нужно поделить более чем на 2, чтобы получить конкретное максимальное значение 4 294 967 295.) Если вы можете отслеживать гекто-единицы (по 100 единиц каждая), вместо 250 500 * 250 500 у вас будет 2,505 * 2,505 = 6 275 025 (12 бит на 12 бит, что может потребовать 24 бита для хранения результата, но случается только 23 бита для этого конкретного случая). Если вы можете отслеживать Quinque гекто единиц (500), вы бы 501 * 501 = 251,001 (9 битов раз 9 битов, хранящихся в 18 бит).

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

Изменить: Незначительная коррекция. Также расширен параграф около 500 единиц, чтобы показать фактические цифры в качестве демонстрации.

0

В настоящее время вопрос гласит: «У нас 250500 * 250500 = 62 570 250 000».

Ну, это полная чушь.
250500 * 250500 = 62 570 250 000. (НЕПРАВИЛЬНАЯ МАТЕМАТА, указанная в вопросе)
250500 * 250500 = 62 750 250 000. (ПРАВАЯ МАТЕМАТИКА, что вопрос, вероятно, хотел задать)

Это отбрасывало некоторые из моих расчетов. Если мы допустим опечатку и исправим ее, то я могу предоставить этот ответ для 62 750 250 000.

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

25 500 - это 18 бит.
2 один бит.
Это требует всего 19 бит. Это 32 бита. Это работает.

На самом деле, этот способ мышления очень похож на то, как процессор x86 (80387 и новее) отслеживает числа с плавающей запятой, используя некоторые биты в качестве Significand.

В вопросе не указано, что 62 570 250 000 необходимо хранить в виде прямого числа. Первое, что можно сделать, это попытаться получить квадратный корень и посмотреть, является ли результат целым числом. Результатом является целое число, и поэтому доступно совершенно правильное решение. Это решение успешно позволяет хранить некоторые числа размером до 549 755 748 352 (что равно 8 388 607 * 65 536, или 8 388 607 * (два подняты до 16-й степени)). Одно из чисел, которое эта система может точно представить,
62750250500
хотя эта же система не сможет хранить
62750250499

Это нормально, хотя, потому что вопрос не требует хранения всех возможных меньших чисел. Вопрос просто хотел представить число 62 750 250 500. Это вполне выполнимо.

Итак, биты, которые вы храните:
0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 0 1 0 1 0 0 0 0 1 0 0

Используя технику, аналогичную обычной сборке с плавающей запятой IEEE, эти биты можно интерпретировать как:

  • положительное число (первый бит)
  • 25500 (биты с 10 по 32)
  • который умножается на себя один раз
    • Потому что ... "1" - это значение битов от 2 до 9.

Обратите внимание, что биты со 2 по 8 и с 10 по 14 являются ведущими нулями. Это 7+5 = 12 битов, которые не очень эффективны в этом случае. Если положительные числа предполагаются, это 13 битов, которые могут быть немного неэффективными / неэффективными для этого конкретного случая, поэтому может быть вероятность того, что они могут использоваться по-другому. (Помните, ранее я говорил, что нам нужно 19 из 32 битов. 13+19 = 32).

Идея здесь заключается в том, что нет необходимости хранить "выходные данные" в виде большого числа, когда вы знаете, что это число может быть легко представлено как степень двух. Значение 62 750 250 000 фактически сохраняется, и способ, которым это представлено, хранит меньшее число вместе с степенью. По сути, мы храним данные, которые, в сочетании с известной формулой, которую мы указали, позволяют нам хранить это конкретное число. (Эта формула может оказаться полезной для хранения других чисел в ситуации, когда люди часто имеют дело с квадратами.)

Примечание. Эта система в некоторой степени похожа, но НЕ является той же, что и система с плавающей запятой IEEE, о которой я говорил в классе сборки на университетском языке, посвященном сборке x86. Вот гиперссылка на онлайн-конвертер для плавающей запятой IEEE, которую вы можете использовать для этой системы. В этой системе биты для показателя степени указывают, какая степень 2 используется для умножения оставшихся битов. Однако это не соответствует этому случаю, так как 25 500 не является степенью двойки. Пытаясь использовать систему с плавающей запятой IEEE, мы можем обнаружить, что 62 750 250 000, разделенные на 16, составляют 3 921 890 625. Таким образом, мы могли бы представить число как 3 921 890 625 раз (два возведены в четвертую степень). Тем не менее, нам потребуется 36 бит, что больше, чем запрашиваемые 32 бит (и больше, чем 24 бит, которые используются сопроцессорами Intel для хранения неэкспонентной версии числа).

Я мог бы в значительной степени игнорировать "использование низкого и высокого" часть вопроса. Я не очень ясно понял, о чем вопрос. Однако эта система действительно использует разные биты для разных целей, и поэтому часть экспоненты данных может считаться "старшими" битами, чем другие биты, размещенные в более низкой позиции. Таким образом, на вопрос "Как мы можем изобразить это" прямо отвечает смелое предложение и объясняется далее с остальной частью этого ответа.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .