2013-04-26 4 views
2

Кто-то хочет менее точно бы написатьFortran оператор с самой высокой появляются две точности в системе

999 format ('The answer is x = ', F8.3) 

Другие желающих более высокую выходную точность может написать

999 format ('The answer is x = ', F18.12) 

Таким образом, это полностью зависит от того, какие желания пользователя. Каков формат , который точно соответствует точности, используемой при расчете? (Примечание может отличаться от системы к системе)

+0

Список, назначенный IO, 'write (*, *)', должен автоматически обеспечивать точность типов в списке. Но вы отказываетесь от управления компоновкой вывода. Есть ли гарантия того, что значения могут быть прочитаны с точным восстановлением значений? –

+0

, без сомнения, вещь, связанная с компилятором, но список направленной записи дает мне чуть меньше точности, чем требуется для считывания значения обратно без потерь (выглядит так: * дает f15.6 для одного значения точности порядка 1, где f15.7 необходимо.) – agentp

+0

@Jagte FYI набивка строки в формате statent - старая школа. Надеюсь, вы не думаете, что это необходимо.write (\ *, \ *) 'Ответ:', x, вероятно, все, что вам нужно, если вы действительно не хотите удерживать себя, возможно, теряя точность в один разряд или вам действительно нужен точный контроль за интервалом. – agentp

ответ

3

Это сложный вопрос, потому что вы запрашиваете «точность расчета», которая зависит от многих факторов. Например: если я разрешаю f (x) = 0 методом Ньютона до допуска 1E-6, вы хотите формат с семью цифрами?

С другой стороны, если вы имеете в виду «наивысшую точность, достигаемую по типу» (например, двойную или одинаковую точность), вы можете просто найти соответствующий epsilon (машинный eps или точность) и использовать это как формат флаг. Если epsilon равен 1E-15, вы можете использовать флаг формата, который не должен содержать более 16 цифр.

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

Например, если epsilon равен 1E-12, то регистр равен -12, абс составляет 12, а пол 12, поэтому вам нужен формат, такой как 15.12F (12 знаков после запятой + 1 точка + нуль + знак = 15 мест)

+0

Чтобы сделать это автоматически, вы можете «ЗАПИСАТЬ» номер, который вы получаете от «EPSILON()», к символу, а затем объедините его в оператор форматирования. – Yossarian

+0

@ Арриета, вы на полпути. Когда вы определяете требуемую точность, вам нужно также учитывать величину числа, чтобы получить точно необходимое количество десятичных знаков. Много работы по переосмыслению списка, направленного на форматирование .. – agentp

+0

@George: Я согласен с тобой ... Мне действительно не нравится мой ответ (я предлагаю хак, который идет на полпути, но у меня нет больше идей ; ( – Escualo

-1

Проблема с числами с плавающей запятой заключается в том, что нет такой точности: только значимые цифры.

Например, если вы вычисляете долготы в реальном * 1, недалеко от Великобритании, вы были бы точны до шести знаков после запятой, но если бы вы были в Колорадо-Спрингсе, это было бы точно только до 4 знаков после запятой. Было бы бессмысленно печатать номер в формате F, это просто мусор после четвертого знака после запятой.

Если вы хотите печатать до максимальной точности, напечатайте в формате E. Так как это всегда n.nn..nEnn, вы получаете все значимые цифры.

Edit - запрос user4050 в Попробуйте следующий пример

program main 
    real intpart, multiplier 
    integer ii 

    multiplier = 1 
    do ii = 1, 6 
     intpart = 9.87654321 
     intpart = intpart * multiplier 
     print '(F15.7 E15.7 G15.8)', intpart, intpart, intpart 
     multiplier = multiplier * 10 
    end do 
    stop 
end program 

Что вы получите что-то вроде

 9.8765430 0.9876543E+01 9.8765430 
    98.7654266 0.9876543E+02 98.765427 
    987.6542969 0.9876543E+03 987.65430 
    9876.5429688 0.9876543E+04 9876.5430 
    98765.4296875 0.9876543E+05 98765.430 
987654.3125000 0.9876543E+06 987654.31 

Обратите внимание, что точность изменения, как число становится больше, потому что только поплавок имеет 7 значительных цифр.

+0

Когда этот ответ понятен, он ошибочен. Хорошее рабочее определение точности числа, хранящегося или управляемое компьютером, - это количество значимых цифр, которые хранятся или обрабатываются. Дескриптор редактирования «e» Fortran можно использовать для записи ни одного , немногие, многие или все значимые цифры «реального». Что касается комментария относительно относительной точности долгот в Великобритании против Колорадо, я полагаю, вы застряли в градусах - переходите к радианам. –

+0

Когда большинство люди, которые используют Fortran, говорят о точности, они означают десятичные разряды. Дело в том, чтобы использовать формат E, а не формат F, чтобы получить значимые цифры. Если используется формат F, вы можете получить все значимые цифры, недостаточные цифры или вы можете получить абсолютное RU bbish. Долгота - это всего лишь пример, который все понимают: это может быть что угодно с широким диапазоном. – cup

+0

@cup Меня интересует ваш ответ, но я не понимаю, как это отличается от формата F, вам все равно нужно указать количество цифр, которые вы хотите распечатать, также в формате E, нет? –

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