Re: 請問是否能用C語言以四則運算實現反三角函數的計算
|
||||
---|---|---|---|---|
資深會員
|
那是查表的的第幾個
這是用 excel 建的table 先在 A 欄 建立 1~255 b 欄 =a1/256*pi() c 欄 =tan(b1) d 欄 =c1*256 e 欄 =dec2hex(d1,4) 這樣我們就將 -127/128π ~ 127/128π 的 tan 值建立出來 之後只要反過來找就可以了 將你的數值*256 後,和 e 欄找出最接近的值,然後對應到 a 就是 arctan了 我剛剛又想到可以查得更精準 0~1/2π 的值和 0~-1/2π 的值事實上是一樣的,只是差個正負號罷了 所以我只要建立 0~90℃ 的表就可以了 所以我用 excel 先在 A 欄 建立 0~179 b 欄 =tan(a1/2*pi())*512 c 欄 =dec2hex(b1,4) 然後將 C欄 的資料整理下來 0x0000,0x0004,0x0008,0x000D,0x0011,0x0016,0x001A,0x001F, 0x0023,0x0028,0x002C,0x0031,0x0035,0x003A,0x003E,0x0043,;0 0x0047,0x004C,0x0051,0x0055,0x005A,0x005E,0x0063,0x0068, 0x006C,0x0071,0x0076,0x007A,0x007F,0x0084,0x0089,0x008D,;1 0x0092,0x0097,0x009C,0x00A1,0x00A6,0x00AB,0x00B0,0x00B5, 0x00BA,0x00BF,0x00C4,0x00C9,0x00CE,0x00D4,0x00D9,0x00DE, 0x00E3,0x00E9,0x00EE,0x00F4,0x00F9,0x00FF,0x0104,0x010A, 0x0110,0x0115,0x011B,0x0121,0x0127,0x012D,0x0133,0x0139, 0x013F,0x0146,0x014C,0x0152,0x0159,0x015F,0x0166,0x016D, 0x0173,0x017A,0x0181,0x0188,0x0190,0x0197,0x019E,0x01A6, 0x01AD,0x01B5,0x01BD,0x01C4,0x01CD,0x01D5,0x01DD,0x01E5, 0x01EE,0x01F7,0x01FF,0x0209,0x0212,0x021B,0x0225,0x022E, 0x0238,0x0242,0x024C,0x0257,0x0262,0x026D,0x0278,0x0283, 0x028F,0x029B,0x02A7,0x02B3,0x02C0,0x02CD,0x02DB,0x02E8, 0x02F7,0x0305,0x0314,0x0323,0x0333,0x0343,0x0354,0x0365, 0x0376,0x0388,0x039B,0x03AE,0x03C2,0x03D7,0x03EC,0x0402, 0x0419,0x0431,0x0449,0x0463,0x047D,0x0499,0x04B6,0x04D4, 0x04F3,0x0513,0x0535,0x0559,0x057E,0x05A5,0x05CE,0x05FA, 0x0627,0x0657,0x068A,0x06C0,0x06F9,0x0736,0x0776,0x07BB, 0x0805,0x0854,0x08A9,0x0905,0x0968,0x09D4,0x0A4A,0x0ACA, 0x0B57,0x0BF3,0x0CA0,0x0D61,0x0E3B,0x0F31,0x1049,0x118D, 0x1307,0x14C5,0x16DC,0x1969,0x1C99,0x20B3,0x2629,0x2DCE, 0x3945,0x4C60,0x7294,0xE52D, 現在我們要棤 0.255 ,只要 *512=0x83 再去查表, 我們會發現資料會落在 0x007F(0x1c),0x0084(0x1d) 數值比較接近 0x1d =29 *0.5℃=14.5℃ tan(14.5℃)=0.25861758435589028187700082104918 更簡單方便的查表 先在 A 欄 建立 0~179 b 欄 =tan((a1+0.25)/2*pi())*1024 c 欄 =dec2hex(b1,4) 之後你發現 數直只能算到 88.5℃ 然後你只要查表一,找到最接近的,就是了,不用再管是靠近上值,還是靠近下值 0x0004,0x000D,0x0016,0x001F,0x0028,0x0031,0x003A,0x0043, 0x004C,0x0055,0x005E,0x0067,0x0070,0x0079,0x0082,0x008B, 0x0094,0x009D,0x00A6,0x00AF,0x00B9,0x00C2,0x00CB,0x00D4, 0x00DE,0x00E7,0x00F1,0x00FA,0x0104,0x010D,0x0117,0x0120, 0x012A,0x0134,0x013D,0x0147,0x0151,0x015B,0x0165,0x016F, 0x0179,0x0183,0x018E,0x0198,0x01A2,0x01AD,0x01B7,0x01C2, 0x01CD,0x01D8,0x01E2,0x01ED,0x01F8,0x0204,0x020F,0x021A, 0x0226,0x0231,0x023D,0x0249,0x0255,0x0261,0x026D,0x0279, 0x0286,0x0292,0x029F,0x02AC,0x02B9,0x02C6,0x02D3,0x02E1, 0x02EE,0x02FC,0x030A,0x0318,0x0327,0x0335,0x0344,0x0353, 0x0362,0x0372,0x0382,0x0391,0x03A2,0x03B2,0x03C3,0x03D4, 0x03E5,0x03F7,0x0408,0x041B,0x042D,0x0440,0x0453,0x0467, 0x047B,0x048F,0x04A4,0x04B9,0x04CF,0x04E5,0x04FB,0x0512, 0x052A,0x0542,0x055B,0x0574,0x058E,0x05A8,0x05C4,0x05DF, 0x05FC,0x0619,0x0637,0x0656,0x0676,0x0697,0x06B9,0x06DB, 0x06FF,0x0724,0x074A,0x0771,0x079A,0x07C4,0x07EF,0x081C, 0x084A,0x087B,0x08AD,0x08E1,0x0917,0x094F,0x0989,0x09C6, 0x0A06,0x0A49,0x0A8E,0x0AD7,0x0B24,0x0B74,0x0BC8,0x0C21, 0x0C7E,0x0CE1,0x0D4A,0x0DB9,0x0E2E,0x0EAB,0x0F31,0x0FC0, 0x1058,0x10FC,0x11AD,0x126C,0x133B,0x141B,0x1511,0x161E, 0x1747,0x188F,0x19FD,0x1B96,0x1D64,0x1F71,0x21CB,0x2486, 0x27B9,0x2B88,0x3023,0x35D3,0x3D07,0x4671,0x5346,0x65CE, 0x82EB,0xB751, 同樣的 查 0.255 *1024 =261= 0x0105 <0x010D(0x1d) 0x1d *0.5 =14.5℃
發表於: 2008/6/26 18:17
|
|||
|
Re: 請問是否能用C語言以四則運算實現反三角函數的計算
|
||||
---|---|---|---|---|
資深會員
|
請問 Eigen 大大:
arctan(0.255) 0.255*2048 =0x020a ,比較到 0x0201(0x8e),0x021C(0x8f), 0x0201 為什麼等於 (0x8e) 0x021C 為什麼等於 (0x8f) 請問怎麼來的?謝謝。
發表於: 2008/6/26 15:51
|
|||
|
Re: 請問是否能用C語言以四則運算實現反三角函數的計算
|
||||
---|---|---|---|---|
資深會員
|
我是用泰勒方式計算, 誤差很小.
發表於: 2008/6/24 12:58
|
|||
Thanks,
Edward Lee |
||||
|
Re: 請問是否能用C語言以四則運算實現反三角函數的計算
|
||||
---|---|---|---|---|
資深會員
|
tab: -127/256~127/256 pi
0xAE84,0xD744,0xE4DA,0xEBA5,0xEFB9,0xF271,0xF463,0xF5D9,0xF6FC,0xF7E4,0xF8A3,0xF942,0xF9C9,0xFA3D,0xFAA1,0xFAF9, 0xFB47,0xFB8C,0xFBCA,0xFC02,0xFC35,0xFC63,0xFC8D,0xFCB4,0xFCD8,0xFCF9,0xFD18,0xFD35,0xFD4F,0xFD68,0xFD80,0xFD96, 0xFDAB,0xFDBE,0xFDD1,0xFDE3,0xFDF3,0xFE03,0xFE13,0xFE21,0xFE2F,0xFE3C,0xFE49,0xFE55,0xFE61,0xFE6C,0xFE76,0xFE81, 0xFE8B,0xFE95,0xFE9E,0xFEA7,0xFEB0,0xFEB8,0xFEC0,0xFEC8,0xFED0,0xFED7,0xFEDE,0xFEE6,0xFEEC,0xFEF3,0xFEFA,0xFF00, 0xFF06,0xFF0C,0xFF12,0xFF18,0xFF1E,0xFF23,0xFF29,0xFF2E,0xFF33,0xFF38,0xFF3D,0xFF42,0xFF47,0xFF4C,0xFF50,0xFF55, 0xFF59,0xFF5E,0xFF62,0xFF67,0xFF6B,0xFF6F,0xFF73,0xFF77,0xFF7B,0xFF7F,0xFF83,0xFF87,0xFF8B,0xFF8F,0xFF92,0xFF96, 0xFF9A,0xFF9D,0xFFA1,0xFFA4,0xFFA8,0xFFAB,0xFFAF,0xFFB2,0xFFB6,0xFFB9,0xFFBD,0xFFC0,0xFFC3,0xFFC7,0xFFCA,0xFFCD, 0xFFD0,0xFFD4,0xFFD7,0xFFDA,0xFFDD,0xFFE0,0xFFE4,0xFFE7,0xFFEA,0xFFED,0xFFF0,0xFFF3,0xFFF7,0xFFFA,0xFFFD,0x0000, 0x0003,0x0006,0x0009,0x000D,0x0010,0x0013,0x0016,0x0019,0x001C,0x0020,0x0023,0x0026,0x0029,0x002C,0x0030,0x0033, 0x0036,0x0039,0x003D,0x0040,0x0043,0x0047,0x004A,0x004E,0x0051,0x0055,0x0058,0x005C,0x005F,0x0063,0x0066,0x006A, 0x006E,0x0071,0x0075,0x0079,0x007D,0x0081,0x0085,0x0089,0x008D,0x0091,0x0095,0x0099,0x009E,0x00A2,0x00A7,0x00AB, 0x00B0,0x00B4,0x00B9,0x00BE,0x00C3,0x00C8,0x00CD,0x00D2,0x00D7,0x00DD,0x00E2,0x00E8,0x00EE,0x00F4,0x00FA,0x0100, 0x0106,0x010D,0x0114,0x011A,0x0122,0x0129,0x0130,0x0138,0x0140,0x0148,0x0150,0x0159,0x0162,0x016B,0x0175,0x017F, 0x018A,0x0194,0x019F,0x01AB,0x01B7,0x01C4,0x01D1,0x01DF,0x01ED,0x01FD,0x020D,0x021D,0x022F,0x0242,0x0255,0x026A, 0x0280,0x0298,0x02B1,0x02CB,0x02E8,0x0307,0x0328,0x034C,0x0373,0x039D,0x03CB,0x03FE,0x0436,0x0474,0x04B9,0x0507, 0x055F,0x05C3,0x0637,0x06BE,0x075D,0x081C,0x0904,0x0A27,0x0B9D,0x0D8F,0x1047,0x145B,0x1B26,0x28BC,0x517C, TAB_H,TAB_L 組合成一個 16bit帶正負號的資料 將你的 數值,*256 之後, 和 TAB_H,TAB_L 做比較 ex: arctan(0.255) 0.255*256 =0x0041 ,比較到 0x0040 (0x93),0x0041,(0x94) 比較接近 0x93 所以arctan(0.255) = ((0x93+1)-128)/256 pi =20/256 pi =0.078125 pi tan(0.0.078125 pi )= 0.25048696019130546159570216012472 大概是這樣做,主要的限制是tan是發散的,因此在 -90 及 90 會變成無限大,使得整個查表精度難以控制 上表以是 tan( 127/128 pin ) =82 下去建的 如果將角度限制在 -86~ 86 ,那查表值的精度會變成 -122/256~122/256 pi 0x938C,0xA31A,0xAEC6,0xB7DD,0xBF23,0xC519,0xCA12,0xCE48, ;0 0xD1E5,0xD508,0xD7C8,0xDA36,0xDC60,0xDE50,0xE010,0xE1A6, 0xE317,0xE46A,0xE5A1,0xE6BF,0xE7C9,0xE8BF,0xE9A4,0xEA7A, ;1 0xEB43,0xEBFF,0xECB0,0xED56,0xEDF4,0xEE89,0xEF16,0xEF9C, 0xF01B,0xF095,0xF108,0xF177,0xF1E1,0xF246,0xF2A7,0xF304, ;2 0xF35E,0xF3B4,0xF407,0xF457,0xF4A4,0xF4EF,0xF537,0xF57C, 0xF5C0,0xF601,0xF641,0xF67E,0xF6BA,0xF6F4,0xF72C,0xF763, ;3 0xF799,0xF7CD,0xF800,0xF832,0xF862,0xF892,0xF8C0,0xF8ED, 0xF919,0xF945,0xF96F,0xF999,0xF9C2,0xF9EA,0xFA11,0xFA38, ;4 0xFA5E,0xFA83,0xFAA8,0xFACC,0xFAEF,0xFB12,0xFB34,0xFB56, 0xFB78,0xFB99,0xFBB9,0xFBD9,0xFBF9,0xFC18,0xFC37,0xFC56, ;5 0xFC74,0xFC92,0xFCB0,0xFCCD,0xFCEA,0xFD07,0xFD23,0xFD3F, 0xFD5B,0xFD77,0xFD93,0xFDAE,0xFDC9,0xFDE4,0xFDFF,0xFE1A, ;6 0xFE34,0xFE4E,0xFE69,0xFE83,0xFE9D,0xFEB6,0xFED0,0xFEEA, 0xFF03,0xFF1D,0xFF36,0xFF50,0xFF69,0xFF82,0xFF9B,0xFFB5, ;7 0xFFCE,0xFFE7,0x0000,0x0019,0x0032,0x004B,0x0065,0x007E, 0x0097,0x00B0,0x00CA,0x00E3,0x00FD,0x0116,0x0130,0x014A, ;8 0x0163,0x017D,0x0197,0x01B2,0x01CC,0x01E6,0x0201,0x021C, 0x0237,0x0252,0x026D,0x0289,0x02A5,0x02C1,0x02DD,0x02F9, ;9 0x0316,0x0333,0x0350,0x036E,0x038C,0x03AA,0x03C9,0x03E8, 0x0407,0x0427,0x0447,0x0467,0x0488,0x04AA,0x04CC,0x04EE, 0x0511,0x0534,0x0558,0x057D,0x05A2,0x05C8,0x05EF,0x0616, 0x063E,0x0667,0x0691,0x06BB,0x06E7,0x0713,0x0740,0x076E, 0x079E,0x07CE,0x0800,0x0833,0x0867,0x089D,0x08D4,0x090C, 0x0946,0x0982,0x09BF,0x09FF,0x0A40,0x0A84,0x0AC9,0x0B11, 0x0B5C,0x0BA9,0x0BF9,0x0C4C,0x0CA2,0x0CFC,0x0D59,0x0DBA, 0x0E1F,0x0E89,0x0EF8,0x0F6B,0x0FE5,0x1064,0x10EA,0x1177, 0x120C,0x12AA,0x1350,0x1401,0x14BD,0x1586,0x165C,0x1741, 0x1837,0x1941,0x1A5F,0x1B96,0x1CE9,0x1E5A,0x1FF0,0x21B0, 0x23A0,0x25CA,0x2838,0x2AF8,0x2E1B,0x31B8,0x35EE,0x3AE7, 0x40DD,0x4823,0x513A,0x5CE6,0x6C74,0x8237, ex: arctan(0.255) 0.255*2048 =0x020a ,比較到 0x0201(0x8e),0x021C(0x8f), 比較接近 0x8e 所以arctan(0.255) = ((0x8e+6)-128)/256 pi =20/256 pi =0.078125 pi tan(0.0.078125 pi )= 0.25048696019130546159570216012472
發表於: 2008/6/24 11:02
|
|||
|
Re: 請問是否能用C語言以四則運算實現反三角函數的計算
|
||||
---|---|---|---|---|
資深會員
|
我需要的是 arc tan 反三角函數,請問有辦法用查表的方式嗎?
發表於: 2008/6/24 9:19
|
|||
|
Re: 請問是否能用C語言以四則運算實現反三角函數的計算
|
||||
---|---|---|---|---|
資深會員
|
三角反三角
用建表查表方式不是也可以嗎? 還是您需要比較精確結果
發表於: 2008/6/24 9:02
|
|||
|
請問是否能用C語言以四則運算實現反三角函數的計算
|
||||
---|---|---|---|---|
資深會員
|
大大們好:
請問是否能用C語言以四則運算實現反三角函數運算,,並且不用內建的函數庫般的使用浮點數運算,因為 16F 系列的 PIC 堆疊實在不夠用,編譯的時候常常會OVERFLOW,所以想找看看有無以手算的方式或是範例程式可用。 謝謝。
發表於: 2008/6/23 17:32
|
|||
|