idl, делающий большие числа = 0.0

#astronomy #idl-programming-language

#астрономия #idl-язык программирования

Вопрос:

Я пытаюсь определить массу черной дыры в центре этой галактики, у меня есть масса в солнечных массах, но она нужна в кг. Однако, когда я пытаюсь преобразовать (1 мсоляр = 1,989 * 10 ^ 30 кг), idl просто дает мне 0,0000. Я понятия не имею, что я делаю не так, и я попытался просто сказать idl напечатать как 1.989 * 10 ^ 30, так и 19890000000000000000000000000000000, а выходные данные равны 0.00000 и -1 соответственно. Может кто-нибудь, пожалуйста, объяснить, почему это происходит?

Комментарии:

1. не знаю IDL, но вот несколько советов: 1. похоже data-type на переполнение, что data-type вы используете для хранения значений? (тип: плавающий / фиксированный / произвольный, количество бит на мантиссу / экспоненту или целое число / десятичное число) 2. также может быть что-то не так с вашим кодом (который вы не предоставили) 3. вы можете столкнуться с некоторым барьером любой функции, которую вы используете.

Ответ №1:

Это ошибка преобразования типа / проблема переполнения. Когда вы используете большие числа, вам нужно либо явно определить их как long или long64 (т. Е. 64-битное целое число) для целых чисел. Для действительных чисел вы можете использовать float или double и для этого самый простой способ следующий:

 msun = 1.989d30
  

что эквивалентно 1,989 x 10 30 как число с плавающей запятой двойной точности. Если вам нужна единичная точность, просто выполните следующие действия:

 msun = 1.989e30
  

Чтобы создать 32- или 64-разрядное целое число, просто используйте:

 msun = 1989L * 10L^(27)
  

или для 64-разрядной

 msun = 1989LL * 10LL^(27)
  

Комментарии:

1. Да, этот ответ выглядит совершенно правильным. Просто примечание — все компьютерные языки, основанные на типах данных C / C , потенциально могут иметь эту проблему, включая Matlab. Одно из отличий заключается в том, что многие языки просто по умолчанию используют значение «double» для всех чисел, чтобы избежать этой проблемы. Это прекрасно подходит для выполнения простых вычислений, но может быть расточительным и медленным, если у вас есть огромные массивы чисел, где каждое удвоение занимает 8 байт. Короче говоря, «знайте свои данные» и используйте соответствующий тип данных.

2. Спасибо! Это действительно сбивало меня с толку, я даже не знал, что это такое.

Ответ №2:

Я согласен с ответом @honeste_vivere о переполнении и типах данных, но я бы добавил, что я часто меняю единицы измерения, чтобы избежать этого. У меня часто есть плотности порядка 1e19 / m ^ 3, поэтому я разыгрываю плотность в единицах 1e19 / m ^ 3, а затем обрабатываю числа порядка 1. Это предотвращает математические ошибки во время подбора наименьших квадратов и других операций, которые могут выполнять такие вещи, как возведение в квадрат моих данных.