|
Ошибка в AVR Studio4 |
|
|
|
 |
Ответов
|
Oct 31 2006, 15:11
|
    
Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731

|
Выражение Цитата (A/B*C/D) вычисляется препроцессором слева направо как целочисленное, и с указанными значениями A/B = 0 без вариантов. К сожалению, Вам придется самому следить за переполнением и потерей точности в таких выражениях. Выражение (A*С/B/D) не приведет ни к потере точности, ни к переполнению. Занятно: Код .EQU A=4100.0 .EQU B=1000000 .EQU C=20000000 .EQU D=1024
LDI R18,low($100-INT(4100.0/B*C/D)) LDI R19,high($100-INT(A/B*C/D)) в R18 получим 0xb0 - правильно, а в R19 0x01 - неправильно. Таки косячок имеется.
|
|
|
|
|
Nov 1 2006, 08:20
|

Шаман
     
Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221

|
Цитата(xemul @ Oct 31 2006, 17:11)  Выражение Цитата (A/B*C/D) вычисляется препроцессором слева направо как целочисленное, и с указанными значениями A/B = 0 без вариантов. К сожалению, Вам придется самому следить за переполнением и потерей точности в таких выражениях. Выражение (A*С/B/D) не приведет ни к потере точности, ни к переполнению. Занятно: Код .EQU A=4100.0 .EQU B=1000000 .EQU C=20000000 .EQU D=1024
LDI R18,low($100-INT(4100.0/B*C/D)) LDI R19,high($100-INT(A/B*C/D)) в R18 получим 0xb0 - правильно, а в R19 0x01 - неправильно. Таки косячок имеется. А если так сделать? Код .EQU A=4100.0 .EQU B=1000000.0 .EQU C=20000000.0 .EQU D=1024.0
LDI R18,low($100-INT(4100.0/B*C/D)) LDI R19,high($100-INT(A/B*C/D))
|
|
|
|
|
Nov 1 2006, 10:54
|
    
Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731

|
Цитата(IgorKossak @ Nov 1 2006, 11:20)  Цитата(xemul @ Oct 31 2006, 17:11)  Выражение Цитата (A/B*C/D) вычисляется препроцессором слева направо как целочисленное, и с указанными значениями A/B = 0 без вариантов. К сожалению, Вам придется самому следить за переполнением и потерей точности в таких выражениях. Выражение (A*С/B/D) не приведет ни к потере точности, ни к переполнению. Занятно: Код .EQU A=4100.0 .EQU B=1000000 .EQU C=20000000 .EQU D=1024
LDI R18,low($100-INT(4100.0/B*C/D)) LDI R19,high($100-INT(A/B*C/D)) в R18 получим 0xb0 - правильно, а в R19 0x01 - неправильно. Таки косячок имеется. А если так сделать? Код .EQU A=4100.0 .EQU B=1000000.0 .EQU C=20000000.0 .EQU D=1024.0
LDI R18,low($100-INT(4100.0/B*C/D)) LDI R19,high($100-INT(A/B*C/D)) Не, это я протормозил  . Как уже указал Andreas1, вещественные константы можно определить только через #define. Более занятно, что при Код #define A 4100 #define B 1000000.0 #define C 20000000 #define D 1024 INT(A/B*C/D) = 0x50 а при Код #define A 4100 #define B 1000000 #define C 20000000.0 #define D 1024 INT(A/B*C/D) = 0x00 Т.е. похоже, что тип результата препроцессор полагает целым, и только когда уткнется в вещественное число, конвертит текущий результат в вещественный формат. Неаккуратненько  .
|
|
|
|
Сообщений в этой теме
Wild007 Ошибка в AVR Studio4 Oct 30 2006, 07:58 TriD HEX обозначается как $100 Oct 30 2006, 08:08 Wild007 Цитата(TriD @ Oct 30 2006, 11:08) HEX обо... Oct 30 2006, 08:14  Wild007 конструкция:
.EQU TTT=0.0041
LDI r17,$100-(TT... Oct 30 2006, 08:27 arttab Цитата4100/1000000
Равно 0, а не 0,0041. и ругает... Oct 30 2006, 08:12 Wild007 Цитата(arttab @ Oct 30 2006, 11:12) Цитат... Oct 30 2006, 08:34 arttab а мой вариант? Oct 30 2006, 08:30 arttab .EQU TTT=0.0041*20000000
LDI r17,0x100-(TTT/1024)
... Oct 30 2006, 08:41 Wild007 Цитата(arttab @ Oct 30 2006, 11:41) .EQU ... Oct 30 2006, 08:56 arttab Думаю что с <1 Oct 30 2006, 08:59 GinRider Думаю, что компилятор автоматически использует INT... Oct 30 2006, 11:47  Wild007 Цитата(GinRider @ Oct 30 2006, 14:47) Дум... Oct 31 2006, 06:35 Yura_K Если использовать ассемблер первой версии (avrasm)... Oct 30 2006, 14:05 Andreas1 У меня не получалось назначить через .EQU нецелое... Oct 31 2006, 07:30 Wild007 Решил проверить коректность работы компилятора, со... Oct 31 2006, 14:16 Gennadiy_ Я писал так:
Код.equ quant=(CK/64)/256
.e... Oct 31 2006, 16:58 Wild007 Даа, проверять, проверять и еще раз проврять... (с... Nov 1 2006, 06:56 Wild007 Проверил в Студии:
.EQU A=4100.0
.EQU B=1000000.0... Nov 1 2006, 08:42 Andreas1 А чем не нравится так
#define A 4100.0
#define B 1... Nov 1 2006, 09:06 Wild007 Цитата(Andreas1 @ Nov 1 2006, 12:06) А че... Nov 1 2006, 09:15 Andreas1 ЦитатаЭто все хорошо, но А,C и D это параметры кот... Nov 1 2006, 09:42 Wild007 .MACRO DELAYMKS ;
.....
LDI R18,$100-(@0/1... Nov 1 2006, 09:50 Andreas1 Ну тогда так
.MACRO DELAYMKS ;
.....
LDI R18,... Nov 1 2006, 10:06 Wild007 .MACRO DELAYMKS ;
.....
LDI R18,$100-INT(@0/1... Nov 1 2006, 12:11
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|