Можно ли написать быструю функцию InvSqrt () Quake на C #?

Если вы хотите использовать npm на клиенте, вы можете использовать browserify , который предназначен для этой цели. Система узла узла несовместима с браузерами, поэтому браузер выполняет трансляцию javascript во что-то, что будет работать. Следовательно, имя: browserify.

30
задан ilitirit 6 November 2008 в 16:48
поделиться

4 ответа

Необходимо быть в состоянии использовать атрибуты StructLayout и FieldOffset для фальсифицирования объединения для простых данных как плавания и ints.

[StructLayout(LayoutKind.Explicit, Size=4)]
private struct IntFloat {
    [FieldOffset(0)]
    public float floatValue;

    [FieldOffset(0)]
    public int intValue;

    // redundant assignment to avoid any complaints about uninitialized members
    IntFloat(int x) {
        floatValue = 0;
        intValue = x;
    }

    IntFloat(float x) { 
        intValue = 0;
        floatValue = x;
    }

    public static explicit operator float (IntFloat x) {
        return x.floatValue;
    }

    public static explicit operator int (IntFloat x) { 
        return x.intValue;
    }

    public static explicit operator IntFloat (int i) {
        return new IntFloat(i);
    }
    public static explicit operator IntFloat (float f) { 
        return new IntFloat(f);
    }
}

Тогда переводящий InvSqrt легок.

13
ответ дан Edward KMETT 6 November 2008 в 16:48
поделиться

Я не вижу, почему это не было бы возможное использование небезопасный параметр компилятора .

1
ответ дан Inisheer 6 November 2008 в 16:48
поделиться
  • 1
    Это - идеальный ответ! отмеченный ответ не работает, если Вы увеличиваете масштаб – FLICKER 20 February 2019 в 01:46

Определенно возможный в небезопасном режиме. Обратите внимание, что даже при том, что в исходном коде Quake 3 константа 0x5f3759df использовалась, , числовое исследование показало что константа 0x5f375a86 на самом деле урожаи лучшие результаты для Приближений Ньютона.

6
ответ дан Tamas Czinege 6 November 2008 в 16:48
поделиться
  • 1
    Полезный! Я должен настроить его без внутренних бровок, и это кажется хитрым. Какие-либо мысли об этом? – Dubmun 6 May 2014 в 19:58

Используйте BitConverter, если Вы хотите избежать небезопасного кода.

float InvSqrt(float x)
{
    float xhalf = 0.5f * x;
    int i = BitConverter.ToInt32(BitConverter.GetBytes(x), 0);
    i = 0x5f3759df - (i >> 1);
    x = BitConverter.ToSingle(BitConverter.GetBytes(i), 0);
    x = x * (1.5f - xhalf * x * x);
    return x;
}

Иначе, код C# является точно тем же как кодом C, который Вы дали, за исключением того, что метод должен быть отмечен как небезопасный:

unsafe float InvSqrt(float x) { ... }
8
ответ дан Bradley Grainger 6 November 2008 в 16:48
поделиться
  • 1
    Панели являются теперь картами в начальной загрузке 4. Так просто заменяют <div class="panel panel-default"> <div class="card">. Кроме того, при создании другого вложенного отделения, окружающего таблицу, поскольку, тело карты заставит его выглядеть более чистым <div class="card-body"> – Marcelo Villa 15 June 2018 в 01:39
Другие вопросы по тегам:

Похожие вопросы: