請問是否能用C語言以四則運算實現反三角函數的計算
|
||||
---|---|---|---|---|
資深會員
|
大大們好:
請問是否能用C語言以四則運算實現反三角函數運算,,並且不用內建的函數庫般的使用浮點數運算,因為 16F 系列的 PIC 堆疊實在不夠用,編譯的時候常常會OVERFLOW,所以想找看看有無以手算的方式或是範例程式可用。 謝謝。
發表於: 2008/6/23 17:32
|
|||
|
Re: 請問是否能用C語言以四則運算實現反三角函數的計算
|
||||
---|---|---|---|---|
資深會員
|
三角反三角
用建表查表方式不是也可以嗎? 還是您需要比較精確結果
發表於: 2008/6/24 9:02
|
|||
|
Re: 請問是否能用C語言以四則運算實現反三角函數的計算
|
||||
---|---|---|---|---|
資深會員
|
我需要的是 arc tan 反三角函數,請問有辦法用查表的方式嗎?
發表於: 2008/6/24 9:19
|
|||
|
Re: 請問是否能用C語言以四則運算實現反三角函數的計算
|
||||
---|---|---|---|---|
資深會員
|
我是用泰勒方式計算, 誤差很小.
發表於: 2008/6/24 12:58
|
|||
Thanks,
Edward Lee |
||||
|
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語言以四則運算實現反三角函數的計算
|
||||
---|---|---|---|---|
資深會員
|
那是查表的的第幾個
這是用 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 大大好聰明哦,羨慕羨慕......
請問一下,我用計算機按 tan(90度) 為何會出現 Error,但 89 度卻有數值,超過 90 度後卻變成負數,為什麼會這樣子? 還有一個問題,就是 C 語言內建的函數數庫是不是因為要能夠計算到 360 度的全域範圍,而且有負號的情況,所以才需要複雜的浮點數運算,謝謝。
發表於: 2008/6/27 13:44
|
|||
|