реклама на сайте
подробности

 
 
> Ошибка конверсии (unsigned int) double ?
ZSN1
сообщение Aug 20 2015, 06:35
Сообщение #1





Группа: Новичок
Сообщений: 9
Регистрация: 20-08-15
Пользователь №: 88 062



Вычисляю sin табличным методом
(LPC2478 в среде Keil 4.23)

кусок кода

Код
....
#define Tabl_acos 0x80000000
...
...
double tsin (double arg)
{
double argout;
unsigned int *adr;

    adr = (unsigned int *)((unsigned int)Tabl_sin + (unsigned int)(fabs(arg)*400));
    argout = *(double *)adr;
    return (argout);
}


Указатель adr при вычислении имеет совершенно фантастическое значение !

А в коде ниже (unsigned int)fabs(arg)*400 работает правильно, но теряется точность, поскольку приведение к uint происходит до умножения на 400.

Код
....
#define Tabl_acos 0x80000000
...
...
double tsin (double arg)
{
double argout;
unsigned int *adr;

    adr = (unsigned int *)((unsigned int)Tabl_sin + (unsigned int)fabs(arg)*400);
    argout = *(double *)adr;
    return (argout);
}


Пробовал разные ключи компилятора - не помогает
Заметил, что ошибка возникает, когда значение arg*400 превышает 255.

Глюк компилятора?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
zltigo
сообщение Aug 20 2015, 07:57
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE
Глюк компилятора?

Нет.
400ULL


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
scifi
сообщение Aug 20 2015, 08:04
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(zltigo @ Aug 20 2015, 10:57) *
400ULL

Ага, щас. Вообще-то 400 перед умножением автоматически приводится к double. Так что ULL ничего не изменит.
Скорее уж 400.0, чтобы убрать неявное приведение типа.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 20 2015, 08:17
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (scifi @ Aug 20 2015, 11:04) *
Ага, щас. Вообще-то 400 перед умножением автоматически приводится к double. Так что ULL ничего не изменит.
Скорее уж 400.0, чтобы убрать неявное приведение типа.

Не обратил внимание, что там double. Да, 400.0



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
scifi
сообщение Aug 20 2015, 08:21
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(zltigo @ Aug 20 2015, 11:17) *
Не обратил внимание, что там double. Да, 400.0

Только это всё равно ничего не изменит.
У меня есть версия. Возможно, стек не выравнен по границе 8 байт, и из-за этого не работает умножение double*double.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 31st July 2025 - 19:11
Рейтинг@Mail.ru


Страница сгенерированна за 0.01412 секунд с 7
ELECTRONIX ©2004-2016