![]() |
|
![]() ![]() ![]() |
|
TepH |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 24.10.2010 Репутация: нет Всего: нет |
Помогите пожалуйста. Нужно написать программу, по которой можно узнать по введённым длинам сторон, существует такой треугольник или нет, а если существует, то какой он: равносторонний, равнобедренный, прямо-,остро-, тупоугольный.
Так вот, я написал, но при вводе длин 0,3; 0,4; 0,5 программа выдаёт, что треугольник остроугольный, хотя должен выдавать, что прямоугольный. Судя по всему, это происходит из-за погрешности преобразований чисел в двоичный код и обратно. Если посмотреть просто на умножение этих чисел, представляя числа, как double precision, получается, что, как я полагаю при возведении в квадрат числа, квадрат которого равен меньше 0,1 , он выдаёт такую бяку. В итоге для квадрата числа 0,3 получается что-то вроде 0,090000642. Из-за этого и происходит ошибка. Подскажите пожалуйста, как избавиться от этого? Вот текст мой программы:
|
|||
|
||||
FCM |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: 8 Всего: 9 |
Сравнивать вещественные числа не есть хорошо в любом языке программирования (в некоторых C++ компиляторах даже предусмотрены предупреждения на сей счет).
Можно попробовать задать некий малый порог и сравнивать с ним модуль разности вещественных чисел. Кроме того, real лучше заменить на real(8). (И что за компилятор используется? В современных (в т.ч. бесплатных) компиляторах - максимум двух и более чисел можно найти с помощью функции max(a,b,c, ...). - операторы сравнения можно писать в естественной форме ==, >, < и т.п. - циклы лучше писать в так называемой блочной форме do...enddo. ) Это сообщение отредактировал(а) FCM - 24.10.2010, 19:23 |
|||
|
||||
TepH |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 24.10.2010 Репутация: нет Всего: нет |
Компиллятор... Даже и не знаю. Мы делаем через программу Putty. Через неё заходим на Unix-сервер и там делаем.
"Можно попробовать задать некий малый порог и сравнивать с ним модуль разности вещественных чисел." Знать бы как... Я ж сам не программист, а тут начали проходить Фортран лабораторными работами, а по обучалке читаем теорию. Но там нет такого(там много чего нету). Преподы говорят, что надо бы, чтобы мы сами додумались... |
|||
|
||||
Фантом |
|
|||
![]() Вы это прекратите! ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1516 Регистрация: 23.3.2008 Репутация: 5 Всего: 49 |
||||
|
||||
FCM |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: 8 Всего: 9 |
||||
|
||||
Фантом |
|
|||
![]() Вы это прекратите! ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1516 Регистрация: 23.3.2008 Репутация: 5 Всего: 49 |
||||
|
||||
FCM |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: 8 Всего: 9 |
Программу можно построить по другому - введя подпрограмму сортировку (например так, чтобы a<=b<=c) чтобы не воодить s и не плодить if-ы
Это сообщение отредактировал(а) FCM - 25.10.2010, 14:02 |
|||
|
||||
TepH |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 24.10.2010 Репутация: нет Всего: нет |
||||
|
||||
FCM |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: 8 Всего: 9 |
Потому что при введении eps надо согласовать все условия. Программу можно построить по другому - введя подпрограмму сортировки , чтобы не воодить s и не плодить if-ы
Выше - если используется f77, оператор > надо заменить на .gt. , а оператор < на .lt. - еще неидеально относительно выбора eps - возможно его лучше выбирать исходя из величины наиболее длинной стороны или т.п. - ну и надо проверить правильно ли работает сортировка Это сообщение отредактировал(а) FCM - 28.10.2010, 09:53 |
|||
|
||||
TepH |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 24.10.2010 Репутация: нет Всего: нет |
Что-то на вашу большую программу шибко ругается.
|
|||
|
||||
FCM |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: 8 Всего: 9 |
Попробй еще раз (ранее была неточность в sort3):
В gfortran работает.
А если продолжает ругаться выложи весь код, на который ругается - может при копировании и вставке ошибки? Это сообщение отредактировал(а) FCM - 25.10.2010, 15:47 |
|||
|
||||
TepH |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 24.10.2010 Репутация: нет Всего: нет |
А теперь работает... Только тут такое дело, уж простите за то, что так гружу Вас, но если ввести, 1, 2, 3 то он пишет, что треугольник тупоугольный, а его, по-идее, не должно существовать (0н будет, так называемый, развёрнутый, т.е. прямая линия)... А в этой программе я даже не знаю, куда сунуться, чтобы это подправить. Что-то потыкался, а это вообще ничего не даёт.
А gfortran - это название компиллятора чтоли? |
|||
|
||||
FCM |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: 8 Всего: 9 |
Вместо строки
лучше так (в предыдущем своем посте тоже поправил)
gfortran - фортран-компилятор из GCC-коллекции (может использоваться как в Linux, так и в Windows). Текщая версия GCC 4.5.x. Это сообщение отредактировал(а) FCM - 25.10.2010, 15:49 |
||||
|
|||||
FCM |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: 8 Всего: 9 |
Возможно, для упрощения, в данном примере, для вводимых чисел можно снять сравнение с использованием порога eps , и оставить eps-проверку только в критических местах.
Будет примерно так:
Это сообщение отредактировал(а) FCM - 25.10.2010, 16:30 |
|||
|
||||
TepH |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 24.10.2010 Репутация: нет Всего: нет |
Хм. Заработало, вроде как... А я был близок к разгадке, когда искал, как подправить.
А, дошло. "a" всегда меньшее, "с" - большее. Поэтому в облегчённом и равенство а=в и в=с (правда бежать пора, потом посмотрю) Спасибо. Вы тут писали, пока, видимо, не исправили, что мне не стоит так, что я не знаю куда сунуться, раз учусь в техническом. Пожалуй Вы правы. Я в технаре учился, там, в общем-то железятник, хоть мы немного проходили qbasic и Turbo Pascal, но там как-то не так всё... И то, почти только ознакомительно. Поэтому довольно сложно не зная сразу программы писать, пусть и простейшие... |
|||
|
||||
![]() ![]() ![]() |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Fortran | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |