image

Любители вы Сишные макросы, так как люблю их я?

При разработке встроенного программного обеспечения часто возникает задача умножения на константу меньше единицы. Типовая задача — рекурсивный фильтр. Умножать на константу легко и приятно, если у вас на борту: много мегагерцев, арифметика с плавающей точкой, аппаратный делитель. А если этого нет? Если любое преобразование во float грозит крахом?

Для решения этих проблем издревле повелось приводить константу к дроби с основанием степень двойки. Например число 0.4 приближенно можно представить как 102/256. Тогда умножение переменной «а» на 0.4, будет выглядеть следующим образом: (а*102)>>8.

Но при разработке реальных программ можно «выстрелить себе в ногу». Для сохранности ваших ног и всего остального рекомендую пользоваться следующими макросами.

Листинг файла «um.h» под катом.

Листинг файла um.h
#ifndef __UM_H
#define __UM_H
//Макросы для умножения на дробную константу в целых числах

//константа кратная 1/8
#define UM8(CONST_FLOAT,CHISLO_INT)                  ((CONST_FLOAT+1.0/16)<(1.0/8))?((CHISLO_INT*0)>>3):                  (((CONST_FLOAT+1.0/16)<(2.0/8))?((CHISLO_INT*1)>>3):                    (((CONST_FLOAT+1.0/16)<(3.0/8))?((CHISLO_INT*2)>>3):                      (((CONST_FLOAT+1.0/16)<(4.0/8))?((CHISLO_INT*3)>>3):                        (((CONST_FLOAT+1.0/16)<(5.0/8))?((CHISLO_INT*4)>>3):                          (((CONST_FLOAT+1.0/16)<(6.0/8))?((CHISLO_INT*5)>>3):                            (((CONST_FLOAT+1.0/16)<(7.0/8))?((CHISLO_INT*6)>>3):                              (((CONST_FLOAT+1.0/16)<(8.0/8))?((CHISLO_INT*7)>>3):                                (CHISLO_INT)                               )                             )                           )                         )                       )                     )                   )

//константа кратная 1/16
#define UM16(CONST_FLOAT,CHISLO_INT)  ((CONST_FLOAT+(1.0/32))<(1.0/16))?((CHISLO_INT*0)>>4):(((CONST_FLOAT+(1.0/32))<(2.0/16))?((CHISLO_INT*1)>>4):(((CONST_FLOAT+(1.0/32))<(3.0/16))?((CHISLO_INT*2)>>4):(((CONST_FLOAT+(1.0/32))<(4.0/16))?((CHISLO_INT*3)>>4):(((CONST_FLOAT+(1.0/32))<(5.0/16))?((CHISLO_INT*4)>>4):(((CONST_FLOAT+(1.0/32))<(6.0/16))?((CHISLO_INT*5)>>4):(((CONST_FLOAT+(1.0/32))<(7.0/16))?((CHISLO_INT*6)>>4):(((CONST_FLOAT+(1.0/32))<(8.0/16))?((CHISLO_INT*7)>>4):(((CONST_FLOAT+(1.0/32))<(9.0/16))?((CHISLO_INT*8)>>4):(((CONST_FLOAT+(1.0/32))<(10.0/16))?((CHISLO_INT*9)>>4):(((CONST_FLOAT+(1.0/32))<(11.0/16))?((CHISLO_INT*10)>>4):(((CONST_FLOAT+(1.0/32))<(12.0/16))?((CHISLO_INT*11)>>4):(((CONST_FLOAT+(1.0/32))<(13.0/16))?((CHISLO_INT*12)>>4):(((CONST_FLOAT+(1.0/32))<(14.0/16))?((CHISLO_INT*13)>>4):(((CONST_FLOAT+(1.0/32))<(15.0/16))?((CHISLO_INT*14)>>4):(((CONST_FLOAT+(1.0/32))<(16.0/16))?((CHISLO_INT*15)>>4):(CHISLO_INT)  )))))))))))))))

//константа кратная 1/32
#define UM32(CONST_FLOAT,CHISLO_INT)  ((CONST_FLOAT+(1.0/64))<(1.0/32))?((CHISLO_INT*0)>>5):(((CONST_FLOAT+(1.0/64))<(2.0/32))?((CHISLO_INT*1)>>5):(((CONST_FLOAT+(1.0/64))<(3.0/32))?((CHISLO_INT*2)>>5):(((CONST_FLOAT+(1.0/64))<(4.0/32))?((CHISLO_INT*3)>>5):(((CONST_FLOAT+(1.0/64))<(5.0/32))?((CHISLO_INT*4)>>5):(((CONST_FLOAT+(1.0/64))<(6.0/32))?((CHISLO_INT*5)>>5):(((CONST_FLOAT+(1.0/64))<(7.0/32))?((CHISLO_INT*6)>>5):(((CONST_FLOAT+(1.0/64))<(8.0/32))?((CHISLO_INT*7)>>5):(((CONST_FLOAT+(1.0/64))<(9.0/32))?((CHISLO_INT*8)>>5):(((CONST_FLOAT+(1.0/64))<(10.0/32))?((CHISLO_INT*9)>>5):(((CONST_FLOAT+(1.0/64))<(11.0/32))?((CHISLO_INT*10)>>5):(((CONST_FLOAT+(1.0/64))<(12.0/32))?((CHISLO_INT*11)>>5):(((CONST_FLOAT+(1.0/64))<(13.0/32))?((CHISLO_INT*12)>>5):(((CONST_FLOAT+(1.0/64))<(14.0/32))?((CHISLO_INT*13)>>5):(((CONST_FLOAT+(1.0/64))<(15.0/32))?((CHISLO_INT*14)>>5):(((CONST_FLOAT+(1.0/64))<(16.0/32))?((CHISLO_INT*15)>>5):(((CONST_FLOAT+(1.0/64))<(17.0/32))?((CHISLO_INT*16)>>5):(((CONST_FLOAT+(1.0/64))<(18.0/32))?((CHISLO_INT*17)>>5):(((CONST_FLOAT+(1.0/64))<(19.0/32))?((CHISLO_INT*18)>>5):(((CONST_FLOAT+(1.0/64))<(20.0/32))?((CHISLO_INT*19)>>5):(((CONST_FLOAT+(1.0/64))<(21.0/32))?((CHISLO_INT*20)>>5):(((CONST_FLOAT+(1.0/64))<(22.0/32))?((CHISLO_INT*21)>>5):(((CONST_FLOAT+(1.0/64))<(23.0/32))?((CHISLO_INT*22)>>5):(((CONST_FLOAT+(1.0/64))<(24.0/32))?((CHISLO_INT*23)>>5):(((CONST_FLOAT+(1.0/64))<(25.0/32))?((CHISLO_INT*24)>>5):(((CONST_FLOAT+(1.0/64))<(26.0/32))?((CHISLO_INT*25)>>5):(((CONST_FLOAT+(1.0/64))<(27.0/32))?((CHISLO_INT*26)>>5):(((CONST_FLOAT+(1.0/64))<(28.0/32))?((CHISLO_INT*27)>>5):(((CONST_FLOAT+(1.0/64))<(29.0/32))?((CHISLO_INT*28)>>5):(((CONST_FLOAT+(1.0/64))<(30.0/32))?((CHISLO_INT*29)>>5):(((CONST_FLOAT+(1.0/64))<(31.0/32))?((CHISLO_INT*30)>>5):(((CONST_FLOAT+(1.0/64))<(32.0/32))?((CHISLO_INT*31)>>5):(CHISLO_INT)  )))))))))))))))))))))))))))))))



//константа кратная 1/64
#define UM64(CONST_FLOAT,CHISLO_INT)  ((CONST_FLOAT+(1.0/128))<(1.0/64))?((CHISLO_INT*0)>>6):(((CONST_FLOAT+(1.0/128))<(2.0/64))?((CHISLO_INT*1)>>6):(((CONST_FLOAT+(1.0/128))<(3.0/64))?((CHISLO_INT*2)>>6):(((CONST_FLOAT+(1.0/128))<(4.0/64))?((CHISLO_INT*3)>>6):(((CONST_FLOAT+(1.0/128))<(5.0/64))?((CHISLO_INT*4)>>6):(((CONST_FLOAT+(1.0/128))<(6.0/64))?((CHISLO_INT*5)>>6):(((CONST_FLOAT+(1.0/128))<(7.0/64))?((CHISLO_INT*6)>>6):(((CONST_FLOAT+(1.0/128))<(8.0/64))?((CHISLO_INT*7)>>6):(((CONST_FLOAT+(1.0/128))<(9.0/64))?((CHISLO_INT*8)>>6):(((CONST_FLOAT+(1.0/128))<(10.0/64))?((CHISLO_INT*9)>>6):(((CONST_FLOAT+(1.0/128))<(11.0/64))?((CHISLO_INT*10)>>6):(((CONST_FLOAT+(1.0/128))<(12.0/64))?((CHISLO_INT*11)>>6):(((CONST_FLOAT+(1.0/128))<(13.0/64))?((CHISLO_INT*12)>>6):(((CONST_FLOAT+(1.0/128))<(14.0/64))?((CHISLO_INT*13)>>6):(((CONST_FLOAT+(1.0/128))<(15.0/64))?((CHISLO_INT*14)>>6):(((CONST_FLOAT+(1.0/128))<(16.0/64))?((CHISLO_INT*15)>>6):(((CONST_FLOAT+(1.0/128))<(17.0/64))?((CHISLO_INT*16)>>6):(((CONST_FLOAT+(1.0/128))<(18.0/64))?((CHISLO_INT*17)>>6):(((CONST_FLOAT+(1.0/128))<(19.0/64))?((CHISLO_INT*18)>>6):(((CONST_FLOAT+(1.0/128))<(20.0/64))?((CHISLO_INT*19)>>6):(((CONST_FLOAT+(1.0/128))<(21.0/64))?((CHISLO_INT*20)>>6):(((CONST_FLOAT+(1.0/128))<(22.0/64))?((CHISLO_INT*21)>>6):(((CONST_FLOAT+(1.0/128))<(23.0/64))?((CHISLO_INT*22)>>6):(((CONST_FLOAT+(1.0/128))<(24.0/64))?((CHISLO_INT*23)>>6):(((CONST_FLOAT+(1.0/128))<(25.0/64))?((CHISLO_INT*24)>>6):(((CONST_FLOAT+(1.0/128))<(26.0/64))?((CHISLO_INT*25)>>6):(((CONST_FLOAT+(1.0/128))<(27.0/64))?((CHISLO_INT*26)>>6):(((CONST_FLOAT+(1.0/128))<(28.0/64))?((CHISLO_INT*27)>>6):(((CONST_FLOAT+(1.0/128))<(29.0/64))?((CHISLO_INT*28)>>6):(((CONST_FLOAT+(1.0/128))<(30.0/64))?((CHISLO_INT*29)>>6):(((CONST_FLOAT+(1.0/128))<(31.0/64))?((CHISLO_INT*30)>>6):(((CONST_FLOAT+(1.0/128))<(32.0/64))?((CHISLO_INT*31)>>6):(((CONST_FLOAT+(1.0/128))<(33.0/64))?((CHISLO_INT*32)>>6):(((CONST_FLOAT+(1.0/128))<(34.0/64))?((CHISLO_INT*33)>>6):(((CONST_FLOAT+(1.0/128))<(35.0/64))?((CHISLO_INT*34)>>6):(((CONST_FLOAT+(1.0/128))<(36.0/64))?((CHISLO_INT*35)>>6):(((CONST_FLOAT+(1.0/128))<(37.0/64))?((CHISLO_INT*36)>>6):(((CONST_FLOAT+(1.0/128))<(38.0/64))?((CHISLO_INT*37)>>6):(((CONST_FLOAT+(1.0/128))<(39.0/64))?((CHISLO_INT*38)>>6):(((CONST_FLOAT+(1.0/128))<(40.0/64))?((CHISLO_INT*39)>>6):(((CONST_FLOAT+(1.0/128))<(41.0/64))?((CHISLO_INT*40)>>6):(((CONST_FLOAT+(1.0/128))<(42.0/64))?((CHISLO_INT*41)>>6):(((CONST_FLOAT+(1.0/128))<(43.0/64))?((CHISLO_INT*42)>>6):(((CONST_FLOAT+(1.0/128))<(44.0/64))?((CHISLO_INT*43)>>6):(((CONST_FLOAT+(1.0/128))<(45.0/64))?((CHISLO_INT*44)>>6):(((CONST_FLOAT+(1.0/128))<(46.0/64))?((CHISLO_INT*45)>>6):(((CONST_FLOAT+(1.0/128))<(47.0/64))?((CHISLO_INT*46)>>6):(((CONST_FLOAT+(1.0/128))<(48.0/64))?((CHISLO_INT*47)>>6):(((CONST_FLOAT+(1.0/128))<(49.0/64))?((CHISLO_INT*48)>>6):(((CONST_FLOAT+(1.0/128))<(50.0/64))?((CHISLO_INT*49)>>6):(((CONST_FLOAT+(1.0/128))<(51.0/64))?((CHISLO_INT*50)>>6):(((CONST_FLOAT+(1.0/128))<(52.0/64))?((CHISLO_INT*51)>>6):(((CONST_FLOAT+(1.0/128))<(53.0/64))?((CHISLO_INT*52)>>6):(((CONST_FLOAT+(1.0/128))<(54.0/64))?((CHISLO_INT*53)>>6):(((CONST_FLOAT+(1.0/128))<(55.0/64))?((CHISLO_INT*54)>>6):(((CONST_FLOAT+(1.0/128))<(56.0/64))?((CHISLO_INT*55)>>6):(((CONST_FLOAT+(1.0/128))<(57.0/64))?((CHISLO_INT*56)>>6):(((CONST_FLOAT+(1.0/128))<(58.0/64))?((CHISLO_INT*57)>>6):(((CONST_FLOAT+(1.0/128))<(59.0/64))?((CHISLO_INT*58)>>6):(((CONST_FLOAT+(1.0/128))<(60.0/64))?((CHISLO_INT*59)>>6):(((CONST_FLOAT+(1.0/128))<(61.0/64))?((CHISLO_INT*60)>>6):(((CONST_FLOAT+(1.0/128))<(62.0/64))?((CHISLO_INT*61)>>6):(((CONST_FLOAT+(1.0/128))<(63.0/64))?((CHISLO_INT*62)>>6):(((CONST_FLOAT+(1.0/128))<(64.0/64))?((CHISLO_INT*63)>>6):(CHISLO_INT)  )))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))

//константа кратная 1/128
#define UM128(CONST_FLOAT,CHISLO_INT) ((CONST_FLOAT+(1.0/256))<(1.0/128))?((CHISLO_INT*0)>>7):(((CONST_FLOAT+(1.0/256))<(2.0/128))?((CHISLO_INT*1)>>7):(((CONST_FLOAT+(1.0/256))<(3.0/128))?((CHISLO_INT*2)>>7):(((CONST_FLOAT+(1.0/256))<(4.0/128))?((CHISLO_INT*3)>>7):(((CONST_FLOAT+(1.0/256))<(5.0/128))?((CHISLO_INT*4)>>7):(((CONST_FLOAT+(1.0/256))<(6.0/128))?((CHISLO_INT*5)>>7):(((CONST_FLOAT+(1.0/256))<(7.0/128))?((CHISLO_INT*6)>>7):(((CONST_FLOAT+(1.0/256))<(8.0/128))?((CHISLO_INT*7)>>7):(((CONST_FLOAT+(1.0/256))<(9.0/128))?((CHISLO_INT*8)>>7):(((CONST_FLOAT+(1.0/256))<(10.0/128))?((CHISLO_INT*9)>>7):(((CONST_FLOAT+(1.0/256))<(11.0/128))?((CHISLO_INT*10)>>7):(((CONST_FLOAT+(1.0/256))<(12.0/128))?((CHISLO_INT*11)>>7):(((CONST_FLOAT+(1.0/256))<(13.0/128))?((CHISLO_INT*12)>>7):(((CONST_FLOAT+(1.0/256))<(14.0/128))?((CHISLO_INT*13)>>7):(((CONST_FLOAT+(1.0/256))<(15.0/128))?((CHISLO_INT*14)>>7):(((CONST_FLOAT+(1.0/256))<(16.0/128))?((CHISLO_INT*15)>>7):(((CONST_FLOAT+(1.0/256))<(17.0/128))?((CHISLO_INT*16)>>7):(((CONST_FLOAT+(1.0/256))<(18.0/128))?((CHISLO_INT*17)>>7):(((CONST_FLOAT+(1.0/256))<(19.0/128))?((CHISLO_INT*18)>>7):(((CONST_FLOAT+(1.0/256))<(20.0/128))?((CHISLO_INT*19)>>7):(((CONST_FLOAT+(1.0/256))<(21.0/128))?((CHISLO_INT*20)>>7):(((CONST_FLOAT+(1.0/256))<(22.0/128))?((CHISLO_INT*21)>>7):(((CONST_FLOAT+(1.0/256))<(23.0/128))?((CHISLO_INT*22)>>7):(((CONST_FLOAT+(1.0/256))<(24.0/128))?((CHISLO_INT*23)>>7):(((CONST_FLOAT+(1.0/256))<(25.0/128))?((CHISLO_INT*24)>>7):(((CONST_FLOAT+(1.0/256))<(26.0/128))?((CHISLO_INT*25)>>7):(((CONST_FLOAT+(1.0/256))<(27.0/128))?((CHISLO_INT*26)>>7):(((CONST_FLOAT+(1.0/256))<(28.0/128))?((CHISLO_INT*27)>>7):(((CONST_FLOAT+(1.0/256))<(29.0/128))?((CHISLO_INT*28)>>7):(((CONST_FLOAT+(1.0/256))<(30.0/128))?((CHISLO_INT*29)>>7):(((CONST_FLOAT+(1.0/256))<(31.0/128))?((CHISLO_INT*30)>>7):(((CONST_FLOAT+(1.0/256))<(32.0/128))?((CHISLO_INT*31)>>7):(((CONST_FLOAT+(1.0/256))<(33.0/128))?((CHISLO_INT*32)>>7):(((CONST_FLOAT+(1.0/256))<(34.0/128))?((CHISLO_INT*33)>>7):(((CONST_FLOAT+(1.0/256))<(35.0/128))?((CHISLO_INT*34)>>7):(((CONST_FLOAT+(1.0/256))<(36.0/128))?((CHISLO_INT*35)>>7):(((CONST_FLOAT+(1.0/256))<(37.0/128))?((CHISLO_INT*36)>>7):(((CONST_FLOAT+(1.0/256))<(38.0/128))?((CHISLO_INT*37)>>7):(((CONST_FLOAT+(1.0/256))<(39.0/128))?((CHISLO_INT*38)>>7):(((CONST_FLOAT+(1.0/256))<(40.0/128))?((CHISLO_INT*39)>>7):(((CONST_FLOAT+(1.0/256))<(41.0/128))?((CHISLO_INT*40)>>7):(((CONST_FLOAT+(1.0/256))<(42.0/128))?((CHISLO_INT*41)>>7):(((CONST_FLOAT+(1.0/256))<(43.0/128))?((CHISLO_INT*42)>>7):(((CONST_FLOAT+(1.0/256))<(44.0/128))?((CHISLO_INT*43)>>7):(((CONST_FLOAT+(1.0/256))<(45.0/128))?((CHISLO_INT*44)>>7):(((CONST_FLOAT+(1.0/256))<(46.0/128))?((CHISLO_INT*45)>>7):(((CONST_FLOAT+(1.0/256))<(47.0/128))?((CHISLO_INT*46)>>7):(((CONST_FLOAT+(1.0/256))<(48.0/128))?((CHISLO_INT*47)>>7):(((CONST_FLOAT+(1.0/256))<(49.0/128))?((CHISLO_INT*48)>>7):(((CONST_FLOAT+(1.0/256))<(50.0/128))?((CHISLO_INT*49)>>7):(((CONST_FLOAT+(1.0/256))<(51.0/128))?((CHISLO_INT*50)>>7):(((CONST_FLOAT+(1.0/256))<(52.0/128))?((CHISLO_INT*51)>>7):(((CONST_FLOAT+(1.0/256))<(53.0/128))?((CHISLO_INT*52)>>7):(((CONST_FLOAT+(1.0/256))<(54.0/128))?((CHISLO_INT*53)>>7):(((CONST_FLOAT+(1.0/256))<(55.0/128))?((CHISLO_INT*54)>>7):(((CONST_FLOAT+(1.0/256))<(56.0/128))?((CHISLO_INT*55)>>7):(((CONST_FLOAT+(1.0/256))<(57.0/128))?((CHISLO_INT*56)>>7):(((CONST_FLOAT+(1.0/256))<(58.0/128))?((CHISLO_INT*57)>>7):(((CONST_FLOAT+(1.0/256))<(59.0/128))?((CHISLO_INT*58)>>7):(((CONST_FLOAT+(1.0/256))<(60.0/128))?((CHISLO_INT*59)>>7):(((CONST_FLOAT+(1.0/256))<(61.0/128))?((CHISLO_INT*60)>>7):(((CONST_FLOAT+(1.0/256))<(62.0/128))?((CHISLO_INT*61)>>7):(((CONST_FLOAT+(1.0/256))<(63.0/128))?((CHISLO_INT*62)>>7):(((CONST_FLOAT+(1.0/256))<(64.0/128))?((CHISLO_INT*63)>>7):(((CONST_FLOAT+(1.0/256))<(65.0/128))?((CHISLO_INT*64)>>7):(((CONST_FLOAT+(1.0/256))<(66.0/128))?((CHISLO_INT*65)>>7):(((CONST_FLOAT+(1.0/256))<(67.0/128))?((CHISLO_INT*66)>>7):(((CONST_FLOAT+(1.0/256))<(68.0/128))?((CHISLO_INT*67)>>7):(((CONST_FLOAT+(1.0/256))<(69.0/128))?((CHISLO_INT*68)>>7):(((CONST_FLOAT+(1.0/256))<(70.0/128))?((CHISLO_INT*69)>>7):(((CONST_FLOAT+(1.0/256))<(71.0/128))?((CHISLO_INT*70)>>7):(((CONST_FLOAT+(1.0/256))<(72.0/128))?((CHISLO_INT*71)>>7):(((CONST_FLOAT+(1.0/256))<(73.0/128))?((CHISLO_INT*72)>>7):(((CONST_FLOAT+(1.0/256))<(74.0/128))?((CHISLO_INT*73)>>7):(((CONST_FLOAT+(1.0/256))<(75.0/128))?((CHISLO_INT*74)>>7):(((CONST_FLOAT+(1.0/256))<(76.0/128))?((CHISLO_INT*75)>>7):(((CONST_FLOAT+(1.0/256))<(77.0/128))?((CHISLO_INT*76)>>7):(((CONST_FLOAT+(1.0/256))<(78.0/128))?((CHISLO_INT*77)>>7):(((CONST_FLOAT+(1.0/256))<(79.0/128))?((CHISLO_INT*78)>>7):(((CONST_FLOAT+(1.0/256))<(80.0/128))?((CHISLO_INT*79)>>7):(((CONST_FLOAT+(1.0/256))<(81.0/128))?((CHISLO_INT*80)>>7):(((CONST_FLOAT+(1.0/256))<(82.0/128))?((CHISLO_INT*81)>>7):(((CONST_FLOAT+(1.0/256))<(83.0/128))?((CHISLO_INT*82)>>7):(((CONST_FLOAT+(1.0/256))<(84.0/128))?((CHISLO_INT*83)>>7):(((CONST_FLOAT+(1.0/256))<(85.0/128))?((CHISLO_INT*84)>>7):(((CONST_FLOAT+(1.0/256))<(86.0/128))?((CHISLO_INT*85)>>7):(((CONST_FLOAT+(1.0/256))<(87.0/128))?((CHISLO_INT*86)>>7):(((CONST_FLOAT+(1.0/256))<(88.0/128))?((CHISLO_INT*87)>>7):(((CONST_FLOAT+(1.0/256))<(89.0/128))?((CHISLO_INT*88)>>7):(((CONST_FLOAT+(1.0/256))<(90.0/128))?((CHISLO_INT*89)>>7):(((CONST_FLOAT+(1.0/256))<(91.0/128))?((CHISLO_INT*90)>>7):(((CONST_FLOAT+(1.0/256))<(92.0/128))?((CHISLO_INT*91)>>7):(((CONST_FLOAT+(1.0/256))<(93.0/128))?((CHISLO_INT*92)>>7):(((CONST_FLOAT+(1.0/256))<(94.0/128))?((CHISLO_INT*93)>>7):(((CONST_FLOAT+(1.0/256))<(95.0/128))?((CHISLO_INT*94)>>7):(((CONST_FLOAT+(1.0/256))<(96.0/128))?((CHISLO_INT*95)>>7):(((CONST_FLOAT+(1.0/256))<(97.0/128))?((CHISLO_INT*96)>>7):(((CONST_FLOAT+(1.0/256))<(98.0/128))?((CHISLO_INT*97)>>7):(((CONST_FLOAT+(1.0/256))<(99.0/128))?((CHISLO_INT*98)>>7):(((CONST_FLOAT+(1.0/256))<(100.0/128))?((CHISLO_INT*99)>>7):(((CONST_FLOAT+(1.0/256))<(101.0/128))?((CHISLO_INT*100)>>7):(((CONST_FLOAT+(1.0/256))<(102.0/128))?((CHISLO_INT*101)>>7):(((CONST_FLOAT+(1.0/256))<(103.0/128))?((CHISLO_INT*102)>>7):(((CONST_FLOAT+(1.0/256))<(104.0/128))?((CHISLO_INT*103)>>7):(((CONST_FLOAT+(1.0/256))<(105.0/128))?((CHISLO_INT*104)>>7):(((CONST_FLOAT+(1.0/256))<(106.0/128))?((CHISLO_INT*105)>>7):(((CONST_FLOAT+(1.0/256))<(107.0/128))?((CHISLO_INT*106)>>7):(((CONST_FLOAT+(1.0/256))<(108.0/128))?((CHISLO_INT*107)>>7):(((CONST_FLOAT+(1.0/256))<(109.0/128))?((CHISLO_INT*108)>>7):(((CONST_FLOAT+(1.0/256))<(110.0/128))?((CHISLO_INT*109)>>7):(((CONST_FLOAT+(1.0/256))<(111.0/128))?((CHISLO_INT*110)>>7):(((CONST_FLOAT+(1.0/256))<(112.0/128))?((CHISLO_INT*111)>>7):(((CONST_FLOAT+(1.0/256))<(113.0/128))?((CHISLO_INT*112)>>7):(((CONST_FLOAT+(1.0/256))<(114.0/128))?((CHISLO_INT*113)>>7):(((CONST_FLOAT+(1.0/256))<(115.0/128))?((CHISLO_INT*114)>>7):(((CONST_FLOAT+(1.0/256))<(116.0/128))?((CHISLO_INT*115)>>7):(((CONST_FLOAT+(1.0/256))<(117.0/128))?((CHISLO_INT*116)>>7):(((CONST_FLOAT+(1.0/256))<(118.0/128))?((CHISLO_INT*117)>>7):(((CONST_FLOAT+(1.0/256))<(119.0/128))?((CHISLO_INT*118)>>7):(((CONST_FLOAT+(1.0/256))<(120.0/128))?((CHISLO_INT*119)>>7):(((CONST_FLOAT+(1.0/256))<(121.0/128))?((CHISLO_INT*120)>>7):(((CONST_FLOAT+(1.0/256))<(122.0/128))?((CHISLO_INT*121)>>7):(((CONST_FLOAT+(1.0/256))<(123.0/128))?((CHISLO_INT*122)>>7):(((CONST_FLOAT+(1.0/256))<(124.0/128))?((CHISLO_INT*123)>>7):(((CONST_FLOAT+(1.0/256))<(125.0/128))?((CHISLO_INT*124)>>7):(((CONST_FLOAT+(1.0/256))<(126.0/128))?((CHISLO_INT*125)>>7):(((CONST_FLOAT+(1.0/256))<(127.0/128))?((CHISLO_INT*126)>>7):(((CONST_FLOAT+(1.0/256))<(128.0/128))?((CHISLO_INT*127)>>7):(CHISLO_INT) )))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))

//константа кратная 1/256
#define UM256(CONST_FLOAT,CHISLO_INT)  ((CONST_FLOAT+(1.0/512))<(1.0/256))?((CHISLO_INT*0)>>8):(((CONST_FLOAT+(1.0/512))<(2.0/256))?((CHISLO_INT*1)>>8):(((CONST_FLOAT+(1.0/512))<(3.0/256))?((CHISLO_INT*2)>>8):(((CONST_FLOAT+(1.0/512))<(4.0/256))?((CHISLO_INT*3)>>8):(((CONST_FLOAT+(1.0/512))<(5.0/256))?((CHISLO_INT*4)>>8):(((CONST_FLOAT+(1.0/512))<(6.0/256))?((CHISLO_INT*5)>>8):(((CONST_FLOAT+(1.0/512))<(7.0/256))?((CHISLO_INT*6)>>8):(((CONST_FLOAT+(1.0/512))<(8.0/256))?((CHISLO_INT*7)>>8):(((CONST_FLOAT+(1.0/512))<(9.0/256))?((CHISLO_INT*8)>>8):(((CONST_FLOAT+(1.0/512))<(10.0/256))?((CHISLO_INT*9)>>8):(((CONST_FLOAT+(1.0/512))<(11.0/256))?((CHISLO_INT*10)>>8):(((CONST_FLOAT+(1.0/512))<(12.0/256))?((CHISLO_INT*11)>>8):(((CONST_FLOAT+(1.0/512))<(13.0/256))?((CHISLO_INT*12)>>8):(((CONST_FLOAT+(1.0/512))<(14.0/256))?((CHISLO_INT*13)>>8):(((CONST_FLOAT+(1.0/512))<(15.0/256))?((CHISLO_INT*14)>>8):(((CONST_FLOAT+(1.0/512))<(16.0/256))?((CHISLO_INT*15)>>8):(((CONST_FLOAT+(1.0/512))<(17.0/256))?((CHISLO_INT*16)>>8):(((CONST_FLOAT+(1.0/512))<(18.0/256))?((CHISLO_INT*17)>>8):(((CONST_FLOAT+(1.0/512))<(19.0/256))?((CHISLO_INT*18)>>8):(((CONST_FLOAT+(1.0/512))<(20.0/256))?((CHISLO_INT*19)>>8):(((CONST_FLOAT+(1.0/512))<(21.0/256))?((CHISLO_INT*20)>>8):(((CONST_FLOAT+(1.0/512))<(22.0/256))?((CHISLO_INT*21)>>8):(((CONST_FLOAT+(1.0/512))<(23.0/256))?((CHISLO_INT*22)>>8):(((CONST_FLOAT+(1.0/512))<(24.0/256))?((CHISLO_INT*23)>>8):(((CONST_FLOAT+(1.0/512))<(25.0/256))?((CHISLO_INT*24)>>8):(((CONST_FLOAT+(1.0/512))<(26.0/256))?((CHISLO_INT*25)>>8):(((CONST_FLOAT+(1.0/512))<(27.0/256))?((CHISLO_INT*26)>>8):(((CONST_FLOAT+(1.0/512))<(28.0/256))?((CHISLO_INT*27)>>8):(((CONST_FLOAT+(1.0/512))<(29.0/256))?((CHISLO_INT*28)>>8):(((CONST_FLOAT+(1.0/512))<(30.0/256))?((CHISLO_INT*29)>>8):(((CONST_FLOAT+(1.0/512))<(31.0/256))?((CHISLO_INT*30)>>8):(((CONST_FLOAT+(1.0/512))<(32.0/256))?((CHISLO_INT*31)>>8):(((CONST_FLOAT+(1.0/512))<(33.0/256))?((CHISLO_INT*32)>>8):(((CONST_FLOAT+(1.0/512))<(34.0/256))?((CHISLO_INT*33)>>8):(((CONST_FLOAT+(1.0/512))<(35.0/256))?((CHISLO_INT*34)>>8):(((CONST_FLOAT+(1.0/512))<(36.0/256))?((CHISLO_INT*35)>>8):(((CONST_FLOAT+(1.0/512))<(37.0/256))?((CHISLO_INT*36)>>8):(((CONST_FLOAT+(1.0/512))<(38.0/256))?((CHISLO_INT*37)>>8):(((CONST_FLOAT+(1.0/512))<(39.0/256))?((CHISLO_INT*38)>>8):(((CONST_FLOAT+(1.0/512))<(40.0/256))?((CHISLO_INT*39)>>8):(((CONST_FLOAT+(1.0/512))<(41.0/256))?((CHISLO_INT*40)>>8):(((CONST_FLOAT+(1.0/512))<(42.0/256))?((CHISLO_INT*41)>>8):(((CONST_FLOAT+(1.0/512))<(43.0/256))?((CHISLO_INT*42)>>8):(((CONST_FLOAT+(1.0/512))<(44.0/256))?((CHISLO_INT*43)>>8):(((CONST_FLOAT+(1.0/512))<(45.0/256))?((CHISLO_INT*44)>>8):(((CONST_FLOAT+(1.0/512))<(46.0/256))?((CHISLO_INT*45)>>8):(((CONST_FLOAT+(1.0/512))<(47.0/256))?((CHISLO_INT*46)>>8):(((CONST_FLOAT+(1.0/512))<(48.0/256))?((CHISLO_INT*47)>>8):(((CONST_FLOAT+(1.0/512))<(49.0/256))?((CHISLO_INT*48)>>8):(((CONST_FLOAT+(1.0/512))<(50.0/256))?((CHISLO_INT*49)>>8):(((CONST_FLOAT+(1.0/512))<(51.0/256))?((CHISLO_INT*50)>>8):(((CONST_FLOAT+(1.0/512))<(52.0/256))?((CHISLO_INT*51)>>8):(((CONST_FLOAT+(1.0/512))<(53.0/256))?((CHISLO_INT*52)>>8):(((CONST_FLOAT+(1.0/512))<(54.0/256))?((CHISLO_INT*53)>>8):(((CONST_FLOAT+(1.0/512))<(55.0/256))?((CHISLO_INT*54)>>8):(((CONST_FLOAT+(1.0/512))<(56.0/256))?((CHISLO_INT*55)>>8):(((CONST_FLOAT+(1.0/512))<(57.0/256))?((CHISLO_INT*56)>>8):(((CONST_FLOAT+(1.0/512))<(58.0/256))?((CHISLO_INT*57)>>8):(((CONST_FLOAT+(1.0/512))<(59.0/256))?((CHISLO_INT*58)>>8):(((CONST_FLOAT+(1.0/512))<(60.0/256))?((CHISLO_INT*59)>>8):(((CONST_FLOAT+(1.0/512))<(61.0/256))?((CHISLO_INT*60)>>8):(((CONST_FLOAT+(1.0/512))<(62.0/256))?((CHISLO_INT*61)>>8):(((CONST_FLOAT+(1.0/512))<(63.0/256))?((CHISLO_INT*62)>>8):(((CONST_FLOAT+(1.0/512))<(64.0/256))?((CHISLO_INT*63)>>8):(((CONST_FLOAT+(1.0/512))<(65.0/256))?((CHISLO_INT*64)>>8):(((CONST_FLOAT+(1.0/512))<(66.0/256))?((CHISLO_INT*65)>>8):(((CONST_FLOAT+(1.0/512))<(67.0/256))?((CHISLO_INT*66)>>8):(((CONST_FLOAT+(1.0/512))<(68.0/256))?((CHISLO_INT*67)>>8):(((CONST_FLOAT+(1.0/512))<(69.0/256))?((CHISLO_INT*68)>>8):(((CONST_FLOAT+(1.0/512))<(70.0/256))?((CHISLO_INT*69)>>8):(((CONST_FLOAT+(1.0/512))<(71.0/256))?((CHISLO_INT*70)>>8):(((CONST_FLOAT+(1.0/512))<(72.0/256))?((CHISLO_INT*71)>>8):(((CONST_FLOAT+(1.0/512))<(73.0/256))?((CHISLO_INT*72)>>8):(((CONST_FLOAT+(1.0/512))<(74.0/256))?((CHISLO_INT*73)>>8):(((CONST_FLOAT+(1.0/512))<(75.0/256))?((CHISLO_INT*74)>>8):(((CONST_FLOAT+(1.0/512))<(76.0/256))?((CHISLO_INT*75)>>8):(((CONST_FLOAT+(1.0/512))<(77.0/256))?((CHISLO_INT*76)>>8):(((CONST_FLOAT+(1.0/512))<(78.0/256))?((CHISLO_INT*77)>>8):(((CONST_FLOAT+(1.0/512))<(79.0/256))?((CHISLO_INT*78)>>8):(((CONST_FLOAT+(1.0/512))<(80.0/256))?((CHISLO_INT*79)>>8):(((CONST_FLOAT+(1.0/512))<(81.0/256))?((CHISLO_INT*80)>>8):(((CONST_FLOAT+(1.0/512))<(82.0/256))?((CHISLO_INT*81)>>8):(((CONST_FLOAT+(1.0/512))<(83.0/256))?((CHISLO_INT*82)>>8):(((CONST_FLOAT+(1.0/512))<(84.0/256))?((CHISLO_INT*83)>>8):(((CONST_FLOAT+(1.0/512))<(85.0/256))?((CHISLO_INT*84)>>8):(((CONST_FLOAT+(1.0/512))<(86.0/256))?((CHISLO_INT*85)>>8):(((CONST_FLOAT+(1.0/512))<(87.0/256))?((CHISLO_INT*86)>>8):(((CONST_FLOAT+(1.0/512))<(88.0/256))?((CHISLO_INT*87)>>8):(((CONST_FLOAT+(1.0/512))<(89.0/256))?((CHISLO_INT*88)>>8):(((CONST_FLOAT+(1.0/512))<(90.0/256))?((CHISLO_INT*89)>>8):(((CONST_FLOAT+(1.0/512))<(91.0/256))?((CHISLO_INT*90)>>8):(((CONST_FLOAT+(1.0/512))<(92.0/256))?((CHISLO_INT*91)>>8):(((CONST_FLOAT+(1.0/512))<(93.0/256))?((CHISLO_INT*92)>>8):(((CONST_FLOAT+(1.0/512))<(94.0/256))?((CHISLO_INT*93)>>8):(((CONST_FLOAT+(1.0/512))<(95.0/256))?((CHISLO_INT*94)>>8):(((CONST_FLOAT+(1.0/512))<(96.0/256))?((CHISLO_INT*95)>>8):(((CONST_FLOAT+(1.0/512))<(97.0/256))?((CHISLO_INT*96)>>8):(((CONST_FLOAT+(1.0/512))<(98.0/256))?((CHISLO_INT*97)>>8):(((CONST_FLOAT+(1.0/512))<(99.0/256))?((CHISLO_INT*98)>>8):(((CONST_FLOAT+(1.0/512))<(100.0/256))?((CHISLO_INT*99)>>8):(((CONST_FLOAT+(1.0/512))<(101.0/256))?((CHISLO_INT*100)>>8):(((CONST_FLOAT+(1.0/512))<(102.0/256))?((CHISLO_INT*101)>>8):(((CONST_FLOAT+(1.0/512))<(103.0/256))?((CHISLO_INT*102)>>8):(((CONST_FLOAT+(1.0/512))<(104.0/256))?((CHISLO_INT*103)>>8):(((CONST_FLOAT+(1.0/512))<(105.0/256))?((CHISLO_INT*104)>>8):(((CONST_FLOAT+(1.0/512))<(106.0/256))?((CHISLO_INT*105)>>8):(((CONST_FLOAT+(1.0/512))<(107.0/256))?((CHISLO_INT*106)>>8):(((CONST_FLOAT+(1.0/512))<(108.0/256))?((CHISLO_INT*107)>>8):(((CONST_FLOAT+(1.0/512))<(109.0/256))?((CHISLO_INT*108)>>8):(((CONST_FLOAT+(1.0/512))<(110.0/256))?((CHISLO_INT*109)>>8):(((CONST_FLOAT+(1.0/512))<(111.0/256))?((CHISLO_INT*110)>>8):(((CONST_FLOAT+(1.0/512))<(112.0/256))?((CHISLO_INT*111)>>8):(((CONST_FLOAT+(1.0/512))<(113.0/256))?((CHISLO_INT*112)>>8):(((CONST_FLOAT+(1.0/512))<(114.0/256))?((CHISLO_INT*113)>>8):(((CONST_FLOAT+(1.0/512))<(115.0/256))?((CHISLO_INT*114)>>8):(((CONST_FLOAT+(1.0/512))<(116.0/256))?((CHISLO_INT*115)>>8):(((CONST_FLOAT+(1.0/512))<(117.0/256))?((CHISLO_INT*116)>>8):(((CONST_FLOAT+(1.0/512))<(118.0/256))?((CHISLO_INT*117)>>8):(((CONST_FLOAT+(1.0/512))<(119.0/256))?((CHISLO_INT*118)>>8):(((CONST_FLOAT+(1.0/512))<(120.0/256))?((CHISLO_INT*119)>>8):(((CONST_FLOAT+(1.0/512))<(121.0/256))?((CHISLO_INT*120)>>8):(((CONST_FLOAT+(1.0/512))<(122.0/256))?((CHISLO_INT*121)>>8):(((CONST_FLOAT+(1.0/512))<(123.0/256))?((CHISLO_INT*122)>>8):(((CONST_FLOAT+(1.0/512))<(124.0/256))?((CHISLO_INT*123)>>8):(((CONST_FLOAT+(1.0/512))<(125.0/256))?((CHISLO_INT*124)>>8):(((CONST_FLOAT+(1.0/512))<(126.0/256))?((CHISLO_INT*125)>>8):(((CONST_FLOAT+(1.0/512))<(127.0/256))?((CHISLO_INT*126)>>8):(((CONST_FLOAT+(1.0/512))<(128.0/256))?((CHISLO_INT*127)>>8):(((CONST_FLOAT+(1.0/512))<(129.0/256))?((CHISLO_INT*128)>>8):(((CONST_FLOAT+(1.0/512))<(130.0/256))?((CHISLO_INT*129)>>8):(((CONST_FLOAT+(1.0/512))<(131.0/256))?((CHISLO_INT*130)>>8):(((CONST_FLOAT+(1.0/512))<(132.0/256))?((CHISLO_INT*131)>>8):(((CONST_FLOAT+(1.0/512))<(133.0/256))?((CHISLO_INT*132)>>8):(((CONST_FLOAT+(1.0/512))<(134.0/256))?((CHISLO_INT*133)>>8):(((CONST_FLOAT+(1.0/512))<(135.0/256))?((CHISLO_INT*134)>>8):(((CONST_FLOAT+(1.0/512))<(136.0/256))?((CHISLO_INT*135)>>8):(((CONST_FLOAT+(1.0/512))<(137.0/256))?((CHISLO_INT*136)>>8):(((CONST_FLOAT+(1.0/512))<(138.0/256))?((CHISLO_INT*137)>>8):(((CONST_FLOAT+(1.0/512))<(139.0/256))?((CHISLO_INT*138)>>8):(((CONST_FLOAT+(1.0/512))<(140.0/256))?((CHISLO_INT*139)>>8):(((CONST_FLOAT+(1.0/512))<(141.0/256))?((CHISLO_INT*140)>>8):(((CONST_FLOAT+(1.0/512))<(142.0/256))?((CHISLO_INT*141)>>8):(((CONST_FLOAT+(1.0/512))<(143.0/256))?((CHISLO_INT*142)>>8):(((CONST_FLOAT+(1.0/512))<(144.0/256))?((CHISLO_INT*143)>>8):(((CONST_FLOAT+(1.0/512))<(145.0/256))?((CHISLO_INT*144)>>8):(((CONST_FLOAT+(1.0/512))<(146.0/256))?((CHISLO_INT*145)>>8):(((CONST_FLOAT+(1.0/512))<(147.0/256))?((CHISLO_INT*146)>>8):(((CONST_FLOAT+(1.0/512))<(148.0/256))?((CHISLO_INT*147)>>8):(((CONST_FLOAT+(1.0/512))<(149.0/256))?((CHISLO_INT*148)>>8):(((CONST_FLOAT+(1.0/512))<(150.0/256))?((CHISLO_INT*149)>>8):(((CONST_FLOAT+(1.0/512))<(151.0/256))?((CHISLO_INT*150)>>8):(((CONST_FLOAT+(1.0/512))<(152.0/256))?((CHISLO_INT*151)>>8):(((CONST_FLOAT+(1.0/512))<(153.0/256))?((CHISLO_INT*152)>>8):(((CONST_FLOAT+(1.0/512))<(154.0/256))?((CHISLO_INT*153)>>8):(((CONST_FLOAT+(1.0/512))<(155.0/256))?((CHISLO_INT*154)>>8):(((CONST_FLOAT+(1.0/512))<(156.0/256))?((CHISLO_INT*155)>>8):(((CONST_FLOAT+(1.0/512))<(157.0/256))?((CHISLO_INT*156)>>8):(((CONST_FLOAT+(1.0/512))<(158.0/256))?((CHISLO_INT*157)>>8):(((CONST_FLOAT+(1.0/512))<(159.0/256))?((CHISLO_INT*158)>>8):(((CONST_FLOAT+(1.0/512))<(160.0/256))?((CHISLO_INT*159)>>8):(((CONST_FLOAT+(1.0/512))<(161.0/256))?((CHISLO_INT*160)>>8):(((CONST_FLOAT+(1.0/512))<(162.0/256))?((CHISLO_INT*161)>>8):(((CONST_FLOAT+(1.0/512))<(163.0/256))?((CHISLO_INT*162)>>8):(((CONST_FLOAT+(1.0/512))<(164.0/256))?((CHISLO_INT*163)>>8):(((CONST_FLOAT+(1.0/512))<(165.0/256))?((CHISLO_INT*164)>>8):(((CONST_FLOAT+(1.0/512))<(166.0/256))?((CHISLO_INT*165)>>8):(((CONST_FLOAT+(1.0/512))<(167.0/256))?((CHISLO_INT*166)>>8):(((CONST_FLOAT+(1.0/512))<(168.0/256))?((CHISLO_INT*167)>>8):(((CONST_FLOAT+(1.0/512))<(169.0/256))?((CHISLO_INT*168)>>8):(((CONST_FLOAT+(1.0/512))<(170.0/256))?((CHISLO_INT*169)>>8):(((CONST_FLOAT+(1.0/512))<(171.0/256))?((CHISLO_INT*170)>>8):(((CONST_FLOAT+(1.0/512))<(172.0/256))?((CHISLO_INT*171)>>8):(((CONST_FLOAT+(1.0/512))<(173.0/256))?((CHISLO_INT*172)>>8):(((CONST_FLOAT+(1.0/512))<(174.0/256))?((CHISLO_INT*173)>>8):(((CONST_FLOAT+(1.0/512))<(175.0/256))?((CHISLO_INT*174)>>8):(((CONST_FLOAT+(1.0/512))<(176.0/256))?((CHISLO_INT*175)>>8):(((CONST_FLOAT+(1.0/512))<(177.0/256))?((CHISLO_INT*176)>>8):(((CONST_FLOAT+(1.0/512))<(178.0/256))?((CHISLO_INT*177)>>8):(((CONST_FLOAT+(1.0/512))<(179.0/256))?((CHISLO_INT*178)>>8):(((CONST_FLOAT+(1.0/512))<(180.0/256))?((CHISLO_INT*179)>>8):(((CONST_FLOAT+(1.0/512))<(181.0/256))?((CHISLO_INT*180)>>8):(((CONST_FLOAT+(1.0/512))<(182.0/256))?((CHISLO_INT*181)>>8):(((CONST_FLOAT+(1.0/512))<(183.0/256))?((CHISLO_INT*182)>>8):(((CONST_FLOAT+(1.0/512))<(184.0/256))?((CHISLO_INT*183)>>8):(((CONST_FLOAT+(1.0/512))<(185.0/256))?((CHISLO_INT*184)>>8):(((CONST_FLOAT+(1.0/512))<(186.0/256))?((CHISLO_INT*185)>>8):(((CONST_FLOAT+(1.0/512))<(187.0/256))?((CHISLO_INT*186)>>8):(((CONST_FLOAT+(1.0/512))<(188.0/256))?((CHISLO_INT*187)>>8):(((CONST_FLOAT+(1.0/512))<(189.0/256))?((CHISLO_INT*188)>>8):(((CONST_FLOAT+(1.0/512))<(190.0/256))?((CHISLO_INT*189)>>8):(((CONST_FLOAT+(1.0/512))<(191.0/256))?((CHISLO_INT*190)>>8):(((CONST_FLOAT+(1.0/512))<(192.0/256))?((CHISLO_INT*191)>>8):(((CONST_FLOAT+(1.0/512))<(193.0/256))?((CHISLO_INT*192)>>8):(((CONST_FLOAT+(1.0/512))<(194.0/256))?((CHISLO_INT*193)>>8):(((CONST_FLOAT+(1.0/512))<(195.0/256))?((CHISLO_INT*194)>>8):(((CONST_FLOAT+(1.0/512))<(196.0/256))?((CHISLO_INT*195)>>8):(((CONST_FLOAT+(1.0/512))<(197.0/256))?((CHISLO_INT*196)>>8):(((CONST_FLOAT+(1.0/512))<(198.0/256))?((CHISLO_INT*197)>>8):(((CONST_FLOAT+(1.0/512))<(199.0/256))?((CHISLO_INT*198)>>8):(((CONST_FLOAT+(1.0/512))<(200.0/256))?((CHISLO_INT*199)>>8):(((CONST_FLOAT+(1.0/512))<(201.0/256))?((CHISLO_INT*200)>>8):(((CONST_FLOAT+(1.0/512))<(202.0/256))?((CHISLO_INT*201)>>8):(((CONST_FLOAT+(1.0/512))<(203.0/256))?((CHISLO_INT*202)>>8):(((CONST_FLOAT+(1.0/512))<(204.0/256))?((CHISLO_INT*203)>>8):(((CONST_FLOAT+(1.0/512))<(205.0/256))?((CHISLO_INT*204)>>8):(((CONST_FLOAT+(1.0/512))<(206.0/256))?((CHISLO_INT*205)>>8):(((CONST_FLOAT+(1.0/512))<(207.0/256))?((CHISLO_INT*206)>>8):(((CONST_FLOAT+(1.0/512))<(208.0/256))?((CHISLO_INT*207)>>8):(((CONST_FLOAT+(1.0/512))<(209.0/256))?((CHISLO_INT*208)>>8):(((CONST_FLOAT+(1.0/512))<(210.0/256))?((CHISLO_INT*209)>>8):(((CONST_FLOAT+(1.0/512))<(211.0/256))?((CHISLO_INT*210)>>8):(((CONST_FLOAT+(1.0/512))<(212.0/256))?((CHISLO_INT*211)>>8):(((CONST_FLOAT+(1.0/512))<(213.0/256))?((CHISLO_INT*212)>>8):(((CONST_FLOAT+(1.0/512))<(214.0/256))?((CHISLO_INT*213)>>8):(((CONST_FLOAT+(1.0/512))<(215.0/256))?((CHISLO_INT*214)>>8):(((CONST_FLOAT+(1.0/512))<(216.0/256))?((CHISLO_INT*215)>>8):(((CONST_FLOAT+(1.0/512))<(217.0/256))?((CHISLO_INT*216)>>8):(((CONST_FLOAT+(1.0/512))<(218.0/256))?((CHISLO_INT*217)>>8):(((CONST_FLOAT+(1.0/512))<(219.0/256))?((CHISLO_INT*218)>>8):(((CONST_FLOAT+(1.0/512))<(220.0/256))?((CHISLO_INT*219)>>8):(((CONST_FLOAT+(1.0/512))<(221.0/256))?((CHISLO_INT*220)>>8):(((CONST_FLOAT+(1.0/512))<(222.0/256))?((CHISLO_INT*221)>>8):(((CONST_FLOAT+(1.0/512))<(223.0/256))?((CHISLO_INT*222)>>8):(((CONST_FLOAT+(1.0/512))<(224.0/256))?((CHISLO_INT*223)>>8):(((CONST_FLOAT+(1.0/512))<(225.0/256))?((CHISLO_INT*224)>>8):(((CONST_FLOAT+(1.0/512))<(226.0/256))?((CHISLO_INT*225)>>8):(((CONST_FLOAT+(1.0/512))<(227.0/256))?((CHISLO_INT*226)>>8):(((CONST_FLOAT+(1.0/512))<(228.0/256))?((CHISLO_INT*227)>>8):(((CONST_FLOAT+(1.0/512))<(229.0/256))?((CHISLO_INT*228)>>8):(((CONST_FLOAT+(1.0/512))<(230.0/256))?((CHISLO_INT*229)>>8):(((CONST_FLOAT+(1.0/512))<(231.0/256))?((CHISLO_INT*230)>>8):(((CONST_FLOAT+(1.0/512))<(232.0/256))?((CHISLO_INT*231)>>8):(((CONST_FLOAT+(1.0/512))<(233.0/256))?((CHISLO_INT*232)>>8):(((CONST_FLOAT+(1.0/512))<(234.0/256))?((CHISLO_INT*233)>>8):(((CONST_FLOAT+(1.0/512))<(235.0/256))?((CHISLO_INT*234)>>8):(((CONST_FLOAT+(1.0/512))<(236.0/256))?((CHISLO_INT*235)>>8):(((CONST_FLOAT+(1.0/512))<(237.0/256))?((CHISLO_INT*236)>>8):(((CONST_FLOAT+(1.0/512))<(238.0/256))?((CHISLO_INT*237)>>8):(((CONST_FLOAT+(1.0/512))<(239.0/256))?((CHISLO_INT*238)>>8):(((CONST_FLOAT+(1.0/512))<(240.0/256))?((CHISLO_INT*239)>>8):(((CONST_FLOAT+(1.0/512))<(241.0/256))?((CHISLO_INT*240)>>8):(((CONST_FLOAT+(1.0/512))<(242.0/256))?((CHISLO_INT*241)>>8):(((CONST_FLOAT+(1.0/512))<(243.0/256))?((CHISLO_INT*242)>>8):(((CONST_FLOAT+(1.0/512))<(244.0/256))?((CHISLO_INT*243)>>8):(((CONST_FLOAT+(1.0/512))<(245.0/256))?((CHISLO_INT*244)>>8):(((CONST_FLOAT+(1.0/512))<(246.0/256))?((CHISLO_INT*245)>>8):(((CONST_FLOAT+(1.0/512))<(247.0/256))?((CHISLO_INT*246)>>8):(((CONST_FLOAT+(1.0/512))<(248.0/256))?((CHISLO_INT*247)>>8):(((CONST_FLOAT+(1.0/512))<(249.0/256))?((CHISLO_INT*248)>>8):(((CONST_FLOAT+(1.0/512))<(250.0/256))?((CHISLO_INT*249)>>8):(((CONST_FLOAT+(1.0/512))<(251.0/256))?((CHISLO_INT*250)>>8):(((CONST_FLOAT+(1.0/512))<(252.0/256))?((CHISLO_INT*251)>>8):(((CONST_FLOAT+(1.0/512))<(253.0/256))?((CHISLO_INT*252)>>8):(((CONST_FLOAT+(1.0/512))<(254.0/256))?((CHISLO_INT*253)>>8):(((CONST_FLOAT+(1.0/512))<(255.0/256))?((CHISLO_INT*254)>>8):(((CONST_FLOAT+(1.0/512))<(256.0/256))?((CHISLO_INT*255)>>8):(CHISLO_INT) ))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) ))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))  

#endif // __UM_H


Теперь для умножения переменной «а» на 0.4, с точностью до 1/256 достаточно написать «UM256(0.4, а)». И пускай за вас думает компилятор, у него мозгов много! При компиляции эти много букв макроса соберутся в простое выражение "(а*102)>>8", которое на большинстве процессоров компилируется в три команды.

Быстрого кода вам, коллеги!
Поделиться с друзьями
-->

Комментарии (6)


  1. Wedmer
    02.08.2017 22:40

    В первую очередь макросы с параметрами нужны, чтобы чуть меньше копипастить.
    Ваш же пример раздует исходники после препроцессинга до космических масштабов.


  1. MaM
    02.08.2017 22:54

    Чет боль какая-то, я после прочтения резко начал подумывать о разводе с макросами


  1. jcmvbkbc
    02.08.2017 23:42

    А почему нельзя было сделать, например, так:

    #define UM256(CONST_FLOAT,CHISLO_INT) (((CHISLO_INT) * (int)((CONST_FLOAT) * 256 + 0.5)) >> 8)
    

    После компиляции
    int f(int v)
    {
            return UM256(0.4, v);
    }
    

    ожидаемо превращается в
    f:
    .LFB0:
            .cfi_startproc
            imull   $102, %edi, %eax
            sarl    $8, %eax
            ret
    


  1. LynXzp
    02.08.2017 23:50

    del, выше предложили вариант лучше.

    И зачем UM8 если есть UM16?


  1. aamonster
    02.08.2017 23:55
    +1

    Шокирован. От изумления аж Atmel Studio запустил — нет, всё в порядке, ((int)(0.4*256+0.5)) компилится ровно в тот же код, что и 102, всё строго по стандарту.


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


    1. jcmvbkbc
      03.08.2017 03:03

      Интересно, что avr-gcc (4.8.1 у меня под рукой оказался) при этом генерирует какой-то трэш, даже с -O2:

      f:
      /* prologue: function */
      /* frame size = 0 */
      /* stack size = 0 */
      .L__stack_usage = 0
              mov r22,r24
              mov r23,r25
              clr r24
              sbrc r23,7
              com r24
              mov r25,r24
              rcall __floatsisf
              ldi r18,lo8(-51)
              ldi r19,lo8(-52)
              ldi r20,lo8(-52)
              ldi r21,lo8(62)
              rcall __mulsf3
              rcall __fixsfsi
              mov r24,r22
              mov r25,r23
              ret
      

      Т.е. аргумент он преобразует во float, умножает два float, а результат преобразует обратно в int.