Хобрук: Ваш путь к мастерству в программировании

Точность не соблюдается

Я использую Visual Studio (2010 SP1) с Fortran IMSL (2011) и не могу получить правильную точность для своих вещественных чисел:

program prova

use, intrinsic :: iso_fortran_env

implicit none

integer, parameter :: ikind=selected_real_kind(p=8, r=99)
real(kind=ikind) ::      a=0.79
real(real64) ::          b=0.79
real(kind=16) ::         c=0.79
real(8) ::               d=0.79

print *, a
print *, b
print *, c
print *, d

end program prova

дайте мне тот же результат: 0.790000021457672 (один с большей точностью, один с меньшей точностью, но каждое число отличается от назначенного: 0,79)

Почему мою готовность не уважают?

Как я могу установить все вещественные числа с необходимой точностью?

NB: моя проблема никак не связана с "ограниченностью компьютера", округлением чисел и тому подобным. моя проблема касается типа/вида переменной в Фортране.



Ответы:


1

Вы устанавливаете переменные с нужной точностью, но затем назначаете константы с точностью по умолчанию. Пытаться:

program prova

use, intrinsic :: iso_fortran_env

implicit none

integer, parameter :: ikind=selected_real_kind(p=8, r=99)
real(kind=ikind) ::      a=0.79_ikind
real(real64) ::          b=0.79_real64
real(kind=16) ::         c=0.79_16
real(8) ::               d=0.79_8

print *, a
print *, b
print *, c
print *, d

end program prova

Это установит константы с правильной точностью, но, поскольку вы предоставляете только две значащие цифры, результат все равно будет округлен до ближайшего представимого числа с плавающей запятой (в базе 2). 0.79 можно точно представить в десятичной системе (по основанию 10), но не в системе счисления 2. Отсюда и отклонения. Вам следует прочитать статью Википедии о числах с плавающей запятой и, конечно же, Что должен знать каждый программист об арифметике с плавающей запятой.

Это приводит к

  0.79000000000000004     
  0.79000000000000004     
  0.790000000000000000000000000000000031      
  0.79000000000000004   

на моей машине.

14.06.2015
  • Хорошо, сегодня я узнал кое-что новое! В любом случае это заставляет меня изменить мой код, весь мой исходный код. Есть ли способ объявить все реальными с желаемой точностью? 14.06.2015
  • Да, вы можете сделать это с помощью большинства компиляторов. Для gfortran это делается с помощью -freal-XX-real-YY см. здесь. Для других компиляторов существуют эквивалентные директивы. Но лично я бы рекомендовал придерживаться явного объявления. Это соответствует стандарту и поддерживается всеми основными компиляторами. Он также проще для чтения и менее подвержен ошибкам. 14.06.2015
  • еще одно сомнение, прежде чем закрыть этот вопрос: предпочитаете ли вы явно устанавливать точность, даже если вам приходится обрабатывать большие массивы данных; например массив молекулярной массы 100 соединений? 14.06.2015
  • Да. Добавленный текст значительно перевешивает потенциальные ошибки из-за отсутствия точности. 14.06.2015
  • Новые материалы

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..