2013-06-20 2 views
1

Мне нужно вывести множество (> 20 миллионов) значений float в текстовый файл из программы Fortran 77. Я хотел бы сохранить выходной файл как можно меньше. Поэтому я хотел бы выводить поплавки компактным образом, не прибегая к двоичному.Fortran 77: выходные поплавки с переменной шириной

Я знаю точность, в которой я нуждаюсь (обычно две цифры справа от десятичной точки), поэтому в C я бы использовал printf("%.2f %.2f", val1, val2); Возможно ли что-то подобное в Fortran 77? Все, что я нашел, это то, что я должен явно задать ширину поля (например, в format (f8.2,x,f8.2)). Это отнимает много места, когда я заранее не знаю диапазон номеров вывода.

Если это невозможно в Fortran 77, сделайте более новые стандарты Fortran, чтобы сделать это?

ответ

3

Стандарт Fortran 2008 позволяет редактировать дескриптор, такой как f0.2, в ответ на который вывод является наименьшей возможной шириной поля, которая записывает всю часть номера, за которой следует десятичная точка и две дробные цифры. Я думаю, что это было частью языкового стандарта со времен Fortran 90, возможно, дольше.

+1

Он появился в [Fortran 95] (http://j3-fortran.org/doc/standing/archive/007/97-007r2/pdf/97-007r2.pdf) (раздел 10.5.1.1 для I-дескриптора , немного дальше для F): в обоих случаях "* Когда w равно нулю, процессор выбирает ширину поля. *". Такая же формулировка в [Fortran 2003] (http://www.j3-fortran.org/doc/year/04/04-007.pdf) раздел 1.6.1.1. Подтверждено [здесь] (http://fortranwiki.org/fortran/show/Edit+descriptors). –

+0

Это также работает с целыми числами, т.е. 'i0' – DJSquared

0

Если у вас есть номер X, тогда INT (LOG10 (X)) + 1 - это размер целой части вашего номера (количество цифр целочисленной части). Таким образом, вам просто нужно сделать некоторые пользовательские метки FORMAT для каждого из значений, которые вы хотите распечатать.

Это не очень элегантный, но я думаю, что это поможет вам достичь того, чего вы хотите.

0

Я знаю, что это может показаться педантичным и бесполезным, но выслушайте меня. Похоже, вы делаете плохую науку. Если ваш инструмент выплескивает цифры от 1000,00 до 0,01, тогда ваш инструмент, вероятно, будет точным только с одной частью в сотне. Поэтому число 9894.36 должно округляться до 9900 (без десятичной точки). Все остальные цифры незначительны. Почему это актуально и полезно? Потому что вы теряете пространство для хранения, если вы храните 9894.36. Итак, ответ заключается в использовании дескриптора g, который выводится в научной нотации. Тогда все ваши номера заняты тем же пространством.

Смежные вопросы