| 477 | } |
| 478 | |
| 479 | float Terathon::Exp(float x) |
| 480 | { |
| 481 | // Values of exp(n) for integers n in the range [-88, 91]. |
| 482 | |
| 483 | alignas(64) static const uint32 table[180] = |
| 484 | { |
| 485 | 0x00000000, 0x00B33687, 0x01739362, 0x022586E0, 0x02E0F96D, 0x0398E2CB, 0x044FCB22, 0x050D35D7, |
| 486 | 0x05BFECBA, 0x06826D27, 0x07314490, 0x07F0EE94, 0x08A3BAF0, 0x095E884F, 0x0A1739FB, 0x0ACD89C1, |
| 487 | 0x0B8BAD78, 0x0C3DD771, 0x0D0102BF, 0x0DAF5800, 0x0E6E511E, 0x0F21F3FE, 0x0FDC1DF9, 0x109595C7, |
| 488 | 0x114B4EA4, 0x120A295C, 0x12BBC7F1, 0x137F388B, 0x142D70C9, 0x14EBBAEC, 0x15A031FC, 0x1659BA5A, |
| 489 | 0x1713F623, 0x17C919B9, 0x1888A975, 0x1939BE2B, 0x19FC7361, 0x1AAB8EDC, 0x1B692BEB, 0x1C1E74DD, |
| 490 | 0x1CD75D5D, 0x1D925B02, 0x1E46EAF1, 0x1F072DBA, 0x1FB7BA0F, 0x2079B5EA, 0x2129B229, 0x21E6A405, |
| 491 | 0x229CBC92, 0x235506F2, 0x2410C457, 0x24C4C239, 0x2585B61D, 0x2635BB8D, 0x26F7000F, 0x27A7DAA4, |
| 492 | 0x28642328, 0x291B090F, 0x29D2B706, 0x2A8F3216, 0x2B429F81, 0x2C044295, 0x2CB3C295, 0x2D7451BD, |
| 493 | 0x2E26083C, 0x2EE1A93F, 0x2F995A46, 0x30506D87, 0x310DA433, 0x31C082B8, 0x3282D314, 0x3331CF19, |
| 494 | 0x33F1AADE, 0x34A43AE5, 0x355F3638, 0x3617B02A, 0x36CE2A62, 0x378C1AA1, 0x383E6BCE, 0x39016791, |
| 495 | 0x39AFE108, 0x3A6F0B5D, 0x3B227290, 0x3BDCC9FF, 0x3C960AAE, 0x3D4BED86, 0x3E0A9555, 0x3EBC5AB2, |
| 496 | 0x3F800000, 0x402DF854, 0x40EC7326, 0x41A0AF2E, 0x425A6481, 0x431469C5, 0x43C9B6E3, 0x44891443, |
| 497 | 0x453A4F54, 0x45FD38AC, 0x46AC14EE, 0x4769E224, 0x481EF0B3, 0x48D805AD, 0x4992CD62, 0x4A478665, |
| 498 | 0x4B07975F, 0x4BB849A4, 0x4C7A7910, 0x4D2A36C8, 0x4DE75844, 0x4E9D3710, 0x4F55AD6E, 0x5011357A, |
| 499 | 0x50C55BFE, 0x51861E9D, 0x52364993, 0x52F7C118, 0x53A85DD2, 0x5464D572, 0x551B8238, 0x55D35BB3, |
| 500 | 0x568FA1FE, 0x5743379A, 0x5804A9F1, 0x58B44F11, 0x597510AD, 0x5A2689FE, 0x5AE2599A, 0x5B99D21F, |
| 501 | 0x5C51106A, 0x5D0E12E4, 0x5DC1192B, 0x5E833952, 0x5F325A0E, 0x5FF267BB, 0x60A4BB3E, 0x615FE4A9, |
| 502 | 0x621826B5, 0x62CECB81, 0x638C881F, 0x643F009E, 0x6501CCB3, 0x65B06A7B, 0x666FC62D, 0x6722F184, |
| 503 | 0x67DD768B, 0x68967FF0, 0x694C8CE5, 0x6A0B01A3, 0x6ABCEDE5, 0x6B806408, 0x6C2E804A, 0x6CED2BEF, |
| 504 | 0x6DA12CC1, 0x6E5B0F2E, 0x6F14DDC1, 0x6FCA5487, 0x70897F64, 0x713AE0EE, 0x71FDFE91, 0x72AC9B6A, |
| 505 | 0x736A98EC, 0x741F6CE9, 0x74D8AE7F, 0x7593401C, 0x76482254, 0x77080156, 0x77B8D9AA, 0x787B3CCF, |
| 506 | 0x792ABBCE, 0x79E80D11, 0x7A9DB1ED, 0x7B56546B, 0x7C11A6F5, 0x7CC5F63B, 0x7D86876D, 0x7E36D809, |
| 507 | 0x7EF882B7, 0x7F800000 |
| 508 | }; |
| 509 | |
| 510 | float f = Floor(x); |
| 511 | int32 i = int32(f) + 88; |
| 512 | if (i > 0) |
| 513 | { |
| 514 | x -= f; |
| 515 | |
| 516 | float r = 1.0F / 362880.0F; |
| 517 | r = r * x + 1.0F / 40320.0F; |
| 518 | r = r * x + 1.0F / 5040.0F; |
| 519 | r = r * x + 1.0F / 720.0F; |
| 520 | r = r * x + 1.0F / 120.0F; |
| 521 | r = r * x + 1.0F / 24.0F; |
| 522 | r = r * x + 1.0F / 6.0F; |
| 523 | r = r * x + 0.5F; |
| 524 | |
| 525 | return ((r * (x * x) + (x + 1.0F)) * reinterpret_cast<const float *>(table)[(i < 179) ? i : 179]); |
| 526 | } |
| 527 | |
| 528 | return (0.0F); |
| 529 | } |
| 530 | |
| 531 | float Terathon::Log(float x) |
| 532 | { |