魔法计算的其他例子

时间:2008-12-01 13:58:04

标签: performance language-agnostic math

我见过this topic here关于约翰卡马克计算平方根的神奇方法,参考这篇文章:http://www.codemaestro.com/reviews/9。这让我很吃惊,我只是没有意识到计算sqrt会如此之快。

我只是想知道电脑游戏用来运行得更快的其他“魔法”例子。

更新: John Carmack不是魔法代码的作者。 This article告诉更多。谢谢@moocha。

5 个答案:

答案 0 :(得分:5)

有一本书收集了很多这些“魔术”,可能对你很有意思:The Hacker's Delight

你有很多技巧,比如钻头等等......(你有几个平方根算法,例如你可以在谷歌书籍版本上看到)

答案 1 :(得分:5)

不完全是数学黑客,但我喜欢Java6中关于 Roman Numerals 的这个:

public class Example {
    public static void main(String[] args) {
        System.out.println(
            MCMLXXVII + XXIV
        );
    }
}
由于重写规则,

会给你expected result(1977 + 24 = 2001 ):
class Transform extends TreeTranslator,Java编译器的内部类。

Transform访问源代码中的所有语句,并将名称与罗马数字匹配的每个变量替换为具有相同数值的int文字。

public class Transform extends TreeTranslator {
    @Override
    public void visitIdent(JCIdent tree) {
        String name = tree.getName().toString();
        if (isRoman(name)) {
            result = make.Literal(numberize(name));
            result.pos = tree.pos;
        } else {
            super.visitIdent(tree);
        }
    }
}

答案 2 :(得分:4)

我是Bresenham Line的忠实粉丝,但是CORDIC rotator当我的CPU速度较慢时,{{3}}为我启用了各种像素的chicanery。

答案 3 :(得分:3)

我一直对两个与日期有关的经典'魔术'算法留下深刻印象:

一些(未经测试的)代码如下:

import math

def dayOfWeek(dayOfMonth, month, year):
    yearOfCentury = year%100
    century = year // 100

    h = int(dayOfMonth + math.floor(26.0*(month + 1)/10) + yearOfCentury \
         + math.floor(float(yearOfCentury)/4) + math.floor(float(century)/4) \
         + 5*century) % 7
    return ['Saturday', 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'][h]

def easter(year):
    a = year%19
    b = year%4
    c = year%7
    k = int(math.floor(float(year)/100))
    p = int(math.floor((13 + 8.0*k)/25))
    q = int(math.floor(float(k)/4))
    M = (15 - p + k - q)%30
    N = (4 + k - q)%7
    d = (19*a + M)%30
    e = (2*b + 4*c + 6*d + N)%7
    day1 =  22 + d + e 
    if day1 <= 31: return "March %d"%day1
    day2 = d + e - 9
    if day2 == 26: return "April 19"
    if day2 == 25 and (11*M + 11)%30 < 19: return "April 18"
    return "April %d"%day2  

print dayOfWeek(2, 12, 2008)  # 'Tuesday'
print easter(2008)            # 'March 23'

答案 4 :(得分:3)

Bit Twiddling Hacks有许多很酷的技巧。

虽然其中有些已经过时了,但迈克尔·阿布拉什(Michael Abrash)对"The Zen of Code Optimization"中的一些技巧感到敬畏。生命游戏的实施令人难以置信。