7,166
edits
(→Tips) |
|||
Line 430: | Line 430: | ||
:除算は少なく。浮動小数は使うな。 | :除算は少なく。浮動小数は使うな。 | ||
:むかしむかし、HP-PA のコンパイラの出すコードに関心したように、RISC の場合は、あるていどコンパイラー任せにできるような(わかりやすい)コードを心がけるのも忘れないように。(むかしついでに... HP-PA の 浮動小数点プロセッサーが Intel 系のそれと精度がちがっていて数日ハマってたな) | :むかしむかし、HP-PA のコンパイラの出すコードに関心したように、RISC の場合は、あるていどコンパイラー任せにできるような(わかりやすい)コードを心がけるのも忘れないように。(むかしついでに... HP-PA の 浮動小数点プロセッサーが Intel 系のそれと精度がちがっていて数日ハマってたな) | ||
==== 除算 ==== | |||
[http://embeddedgurus.com/stack-overflow/2009/06/division-of-integers-by-constants/ Division of integers by constants « Stack Overflow] | |||
:Using the values generated by Jones, together with some of the values I have computed, here’s a summary of some common divisors for unsigned 16 bit integers. | |||
<syntaxhighlight lang="c" enclose="div"> | |||
Divide by 3: (((uint32_t)A * (uint32_t)0xAAAB) >> 16) >> 1 | |||
Divide by 5: (((uint32_t)A * (uint32_t)0xCCCD) >> 16) >> 2 | |||
Divide by 6: (((uint32_t)A * (uint32_t)0xAAAB) >> 16) >> 2 | |||
Divide by 7: ((((uint32_t)A * (uint32_t)0x2493) >> 16) + A) >> 1) >> 2 | |||
Divide by 9: (((uint32_t)A * (uint32_t)0xE38F) >> 16) >> 3 | |||
Divide by 10: (((uint32_t)A * (uint32_t)0xCCCD) >> 16) >> 3 | |||
Divide by 11: (((uint32_t)A * (uint32_t)0xBA2F) >> 16) >> 3 | |||
Divide by 12: (((uint32_t)A * (uint32_t)0xAAAB) >> 16) >> 3 | |||
Divide by 13: (((uint32_t)A * (uint32_t)0x9D8A) >> 16) >> 3 | |||
Divide by 14: ((((uint32_t)A * (uint32_t)0x2493) >> 16) + A) >> 1) >> 3 | |||
Divide by 15: (((uint32_t)A * (uint32_t)0x8889) >> 16) >> 3 | |||
Divide by 30: (((uint32_t)A * (uint32_t)0x8889) >> 16) >> 4 | |||
Divide by 60: (((uint32_t)A * (uint32_t)0x8889) >> 16) >> 5 | |||
Divide by 100: (((((uint32_t)A * (uint32_t)0x47AF) >> 16U) + A) >> 1) >> 6 | |||
Divide by PI: ((((uint32_t)A * (uint32_t)0x45F3) >> 16) + A) >> 1) >> 1 | |||
Divide by √2: (((uint32_t)A * (uint32_t)0xB505) >> 16) >> 0 | |||
</syntaxhighlight> | |||
=== メモメモ=== | === メモメモ=== |