Умножение без операторов в С# MSCorLib?

Я копался в MSCoreLib и наткнулся на кое-что интересное.

Я смущен, как это вообще работает.

(ссылка http://referencesource.microsoft.com/#mscorlib/system/math.cs строка 32)

   // This table is required for the Round function which can specify the number of digits to round to
      private static double[] roundPower10Double = new double[] { 
          1E0, 1E1, 1E2, 1E3, 1E4, 1E5, 1E6, 1E7, 1E8,
          1E9, 1E10, 1E11, 1E12, 1E13, 1E14, 1E15
      };          

      public const double E  = 2.7182818284590452354;

Похоже, они создают двойной массив. Затем для каждого значения умножается на 1 * E * nth. Это то, что КАЖЕТСЯ происходит, но они не используют никаких операторов?

Что это за темная магия?


person Anthony Russell    schedule 05.08.2014    source источник
comment
Как что работает? Что вы имеете в виду, кроме этого массива и этого E?   -  person Lasse V. Karlsen    schedule 05.08.2014
comment
Нет. Это разрешено синтаксисом, вы можете использовать его в своем коде: var myDouble = 1e3. В основном это означает (e — сокращение от экспоненты): 1 * 10 ^ 3.   -  person    schedule 05.08.2014
comment
Я думаю, вы были сбиты с толку, потому что нашли константу с именем E. Но E в массиве не является именем этой константы. Это буквальное обозначение означает x 10 ^. Поскольку это литерал, это также не умножение. Он напрямую компилируется в определенное число.   -  person chiccodoro    schedule 05.08.2014
comment
BTW: не путайте это e с const decalared в исходном коде, который вы вставили. Есть две отдельные вещи.   -  person    schedule 05.08.2014
comment
@pwas, так почему это должно быть e? Это может быть что угодно? я могу сделать 1myVariableName3 ?   -  person Anthony Russell    schedule 05.08.2014
comment
Нет-нет, прочтите мой более поздний комментарий и комментарий @chiccodoro.   -  person    schedule 05.08.2014
comment
а второй E - постоянная Эйлера   -  person sasjaq    schedule 05.08.2014
comment
@sasjaq это не постоянная Эйлера (постоянная Эйлера равна примерно 0,5) - это число Эйлера (основание натурального логарифма)   -  person    schedule 05.08.2014
comment
@chiccodoro да, вот что происходит   -  person Anthony Russell    schedule 05.08.2014
comment
@pwas о, конечно... public const ввели меня в заблуждение :)   -  person sasjaq    schedule 05.08.2014


Ответы (3)


Нет, вас смущает обозначение.

2e4 == 2E4 == 20000

просто означает 2 * 10^4. e или E - это обозначение «показатель степени». Полезно предотвратить запись большого количества нулей. Второй E не имеет ничего общего с первым. Второй — идентификатор. Но идентификаторы не разрешены в double литералах (и литералах вообще).

Пример:

скажем, вы хотите сохранить константу Авогадро, тогда вы можете написать:

double Avogadro = 602300000000000000000000.0;

Но это сбивает с толку (поскольку нужно считать нули и можно легко ошибиться). Однако можно написать:

double Avogadro = 6.023e23;
person Willem Van Onsem    schedule 05.08.2014
comment
Хорошо, это то, что я думал, что это делает. Я был просто сбит с толку, потому что прямо под массивом у них было объявление переменной с таким точным именем переменной, лол.. - person Anthony Russell; 05.08.2014

Это обозначение E. 1E2 означает 1 * 10^2 или, в более общем смысле, xEy = x * 10^y. Вы также можете использовать строчную букву e.

Определенное ниже public const double E = 2.7182818284590452354 является несвязанной (но очень важной!) математической константой.

person dee-see    schedule 05.08.2014

Синтаксис «1E3» — это просто сокращенный способ выражения 1 * 10^3. Это просто трюк компилятора. Однако обратите внимание, что это константа времени компиляции. Вы не можете использовать переменные там. Однако вы можете использовать десятичные дроби: 2.57E4 = 25700.

person James Curran    schedule 05.08.2014