Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Глюки на тригонометрии при углах в 90n градусов. 
:(
    Опции темы
Mal Hack
Дата 5.1.2006, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: нет
Всего: 261



Код:
Код

 long double angle;
 angle = DegToRad( StrToFloat( MaskEdit1 -> Text ) );
....
 AngleGrid -> Cells[1][0] = FloatToStr( Sin( angle ) );
 AngleGrid -> Cells[1][1] = FloatToStr( Cos( angle ) );

При вводе имеем:
0: sin = 0, cos =1
90: sin = 1, cos = -2.7
180: sin = -5.4, cos = -1

К примеру на углах 45, 135, 405 все в норме.

PM ICQ   Вверх
BreakPointMAN
Дата 5.1.2006, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 15.9.2004
Где: Saratov

Репутация: 6
Всего: 24



Что-то я не помню таких функций, как Sin и Cos... хмм...
А может, ошибка появляется при отображении? Ну, места там не хватает... или при преобразовании что-то случается...


--------------------
"Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце")
PM WWW ICQ   Вверх
_hunter
Дата 5.1.2006, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



насколько я помню они радианы принимают... + что за странное название ( с большой буквы )? в math.h с маленькой...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Mal Hack
Дата 5.1.2006, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: нет
Всего: 261



Цитата(_hunter @ 5.1.2006, 16:19 Найти цитируемый пост)

насколько я помню они радианы принимают... + что за странное название ( с большой буквы )? в math.h с маленькой...


Я в BDS 2006. Там есть Math.hpp и Math.h, из первой - с большой буквы, из второй - с маленькой. Но замена их на маленькие результата не меняет. По крайней мере в лучшую сторону.
Цитата(BreakPointMAN @ 5.1.2006, 16:17 Найти цитируемый пост)

А может, ошибка появляется при отображении? Ну, места там не хватает... или при преобразовании что-то случается...

Все преобразования приведены выше.
Вряд ли там места не хватает. На 45 все окей, как и в 0.
Добавлено @ 16:28
Цитата(_hunter @ 5.1.2006, 16:19 Найти цитируемый пост)

насколько я помню они радианы принимают...

Я им их и передаю. DegToRad преобразует. Преобразует правильно.
Проверялся так:
Код

 Edit5 -> Text =  FloatToStr( DegToRad( StrToFloat( MaskEdit1 -> Text ) ) );

Пишет нормальные значения PI, PI/2.
PM ICQ   Вверх
Illuminaty
Дата 5.1.2006, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


/*Антон Захаров*/
***


Профиль
Группа: Комодератор
Сообщений: 1238
Регистрация: 19.3.2005
Где: Россия, Казань

Репутация: нет
Всего: 56



а если напрямую написать?
Код

Sin(angle * PI / 180)


Это сообщение отредактировал(а) Illuminaty - 5.1.2006, 16:30
PM MAIL ICQ   Вверх
Mal Hack
Дата 5.1.2006, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: нет
Всего: 261



Не помогает.
PM ICQ   Вверх
Illuminaty
Дата 5.1.2006, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


/*Антон Захаров*/
***


Профиль
Группа: Комодератор
Сообщений: 1238
Регистрация: 19.3.2005
Где: Россия, Казань

Репутация: нет
Всего: 56



а что выводит при явном задании значения переменной angle ?
Код

angle=180.0;


Это сообщение отредактировал(а) Illuminaty - 5.1.2006, 16:45
PM MAIL ICQ   Вверх
_hunter
Дата 5.1.2006, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



стоп. все правтльно оно выдает.
при 180 син не -5.4 а -5.4 * 10^(-20) ( т.е. 0 )
напиши что-то типа AngleGrid -> Cells[1][0] = AnsiString().sprintf("%.3f", Sin( angle ) );


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Partizan
Дата 5.1.2006, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 7
Всего: 67



У меня в BC++B6 результаты совершенно адекватные...
Код

long double angle;
 angle = DegToRad(180);
 AngleGrid -> Cells[1][0] = FloatToStr( sin( angle ) );
 AngleGrid -> Cells[1][1] = FloatToStr( cos( angle ) );


Выполнение этого кода даёт нам
sin: 1,2246...........E-16
cos: 1



--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Mal Hack
Дата 5.1.2006, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: нет
Всего: 261



Цитата(_hunter @ 5.1.2006, 16:57 Найти цитируемый пост)

напиши что-то типа AngleGrid -> Cells[1][0] = AnsiString().sprintf("%.3f", Sin( angle ) );

"Что-то типа" не помогло. Помогло вот что:
Код

AngleGrid -> Cells[1][0] = FloatToStr( RoundTo( Sin( angle ) , -10 ) );


Огромное тебе спасибо !!!
Добавлено @ 17:16
Хотя каждый раз Round использовать не хочется smile
PM ICQ   Вверх
_hunter
Дата 5.1.2006, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



а что значит не помогло?
минус мешает?
так его убрать можно...
или вообще так:
if ( abs(sin) < 0.00000000001 )
sin = 0;
написать
а потом sprintf ему...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Mal Hack
Дата 5.1.2006, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: нет
Всего: 261



У косинуса при - был -0.000
Минус тут не при чем. Там 1 должна быть smile
PM ICQ   Вверх
_hunter
Дата 5.1.2006, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



похоже sprintf() с long double-ами не работает. приводи перед конвертацией к doublе -- всеравно все знаки пользователю вряд ли нужны...
AnsiString().sprintf("%0.3f", (double)(Sin(DegToRad(angle))));


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Mal Hack
Дата 5.1.2006, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: нет
Всего: 261



_hunter сработало. Слу, а что лучше в плане быстродействия и грамотности кода?
RoundTo или через sprintf?
PM ICQ   Вверх
_hunter
Дата 6.1.2006, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



интересный вопрос...
sprintf точно не меделеннее ( потому как при RounTo/FormatFloat выполняются аналогичные операции ) а возможно и быстрее -- новое значение не создается ( RounTo )
в любом случае нужно эксперимент ставить
а в полане грамотности ( а точнее красоты кода ) sprintf явно лучше


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.1686 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.