2015-04-23 4 views
0

Я хотел бы использовать k для вычисления времени выполнения цикла for. Это было бы миллиарды раз, и я попробовал long64, а затем через некоторое время k стал отрицательным. Есть ли другой способ сделать это?Как расширить диапазон переменной в idl

Извините, я думаю, что сделал неправильное описание. Мой код представляет собой 3-слойный блок for и каждый из них вычисляет 2 * 256^3 числа, как только значение равно 0, я хотел бы сделать k+=k. В конце я установил print, 'k=', k, и когда idl бежал, я обнаружил, что k пробег с положительного на отрицательный. Я использовал кластер для вычисления, так что это заняло довольно много времени.

+0

Я не знаю, как вы это делаете, но вам нужно будет выполнить более 9223372036854775807 петли перед тем, вызывая 'long64' переменную пролонгировать, которая будет принимать ваш компьютер Невероятное (миллионы секунд при ~ 2,6 x 10^{9} петель в секунду). Не могли бы вы показать минимальный рабочий пример вашего кода? Вы могли бы использовать удвоители для подсчета, но обычно цикл 'FOR' имеет свой собственный индекс, который он использует, поэтому я еще не уверен, что вы делаете. –

+0

Извините, я думаю, что сделал неправильное описание. Мой код является 3-слойным блоком 'for' nest, и каждый из них вычисляет 2 * 256^3 числа, как только значение равно 0, я хотел бы сделать k + = k. В конце я сделал 'print, 'k =', k', и когда' idl' работает, я обнаружил, что k пробег от положительного до отрицательного. Я использую кластер для вычисления, так что это заняло довольно много времени. – Schawn

+0

Тогда я предполагаю, что mgalloy правильный. Когда вы сначала определяете 'k', убедитесь, что вы определили его как переменную' long64'. IDL автоматически увеличит тип кода до типа с «большим» динамическим диапазоном, если вы используете переменную с «более крупным» типом (например, более крупным я имею в виду переход от 16-битного целого к 32-битовому целому числу). –

ответ

1

Мое предположение, что вы на самом деле не используете long64 для k. Тип переменной цикла в цикле for берется из начального значения. Например, в данном случае:

k = 0LL 
for k = 0, n - 1 do ... 

k является INT (16 бит), потому что 0 является Int. Вы, вероятно, хотите что-то вроде:

for k = 0LL, n - 1LL do begin ...