Как я могу представить число с большей точностью, чем число с плавающей запятой, используя только числа с плавающей запятой и/или целые числа

Я написал шейдер MandelBrot на основе этого: http://blogs.msdn.com/b/shawnhar/archive/2006/12/11/sixty-fractals-per-second.aspx

float4 PixelShader(float2 texCoord : TEXCOORD0) : COLOR0
{
    float2 c = (texCoord - 0.5) * Zoom * float2(1, Aspect) - Pan;
    float2 v = 0;

    for (int n = 0; n < Iterations; n++)
    {
        v = float2(v.x * v.x - v.y * v.y, v.x * v.y * 2) + c;
    }

    return (dot(v, v) > 1) ? 1 : 0;
}

Я хотел бы увеличить количество, которое я могу увеличить, используя что-то более точное, чем поплавок. Я прочитал несколько вещей в Интернете, таких как http://www.bealto.com/mp-mandelbrot_fp128-opencl.html однако его довольно сложно понять, и он неполный.

Используемый мной графический процессор не поддерживает двойное число, поэтому я застрял с 32-битными целыми числами и числами с плавающей запятой (и векторами/массивами чисел с плавающей запятой длиной до 4).

Как я могу представить одно число с плавающей запятой более точным способом, чем позволяет обычный float?

Мне нужно поддерживать следующие операции: x, +, - и (> или >=)

Я использую модель пиксельного шейдера 3.0.


Я просмотрел формат числа Q, однако у меня возникла проблема заключается в том, что если я использую 2 32-битных целых числа, мне нужна 64-битная временная переменная для умножения (и деления).


person George Duckett    schedule 18.10.2011    source источник
comment
Вам придется разработать свой собственный формат с плавающей запятой (или найти кого-то, кто уже сделал это). Это не тривиально.   -  person Raymond Chen    schedule 18.10.2011


Ответы (1)


В следующем сообщении в блоге рассматриваются некоторые из описанных вами проблем, в том числе эмуляция двойной точности с использованием двух чисел с плавающей запятой в GLSL.

http://www.thasler.org/blog/?p=93

Поиск в Google «эмулированной двойной точности» должен выдать еще несколько ссылок.

person Andrew Marshall    schedule 18.10.2011