Double precision mandel что это

Одинарная или двойная точность?

Введение

Статья также написана для тех из вас, у кого много данных. Если вам требуется несколько чисел тут или там, просто используйте double и не забивайте себе голову!

Точность данных

У 32-битных чисел с плавающей запятой точность примерно 24 бита, то есть около 7 десятичных знаков, а у чисел с двойной точностью — 53 бита, то есть примерно 16 десятичных знаков. Насколько это много? Вот некоторые грубые оценки того, какую точность вы получаете в худшем случае при использовании float и double для измерения объектов в разных диапазонах:

Почему всегда не хранить всё с двойной точностью?

Влияние на производительность вычислений с одинарной и двойной точностью

Когда производить вычисления с увеличенной точностью

Даже если вы храните данные с одинарной точностью, в некоторых случаях уместно использовать двойную точность при вычислениях. Вот простой пример на С:

Если вы запустите этот код на десяти числах одинарной точности, то не заметите каких-либо проблем с точностью. Но если запустите на миллионе чисел, то определённо заметите. Причина в том, что точность теряется при сложении больших и маленьких чисел, а после сложения миллиона чисел, вероятно, такая ситуация встретится. Практическое правило такое: если вы складываете 10^N значений, то теряете N десятичных знаков точности. Так что при сложении тысячи (10^3) чисел теряются три десятичных знака точности. Если складывать миллион (10^6) чисел, то теряются шесть десятичных знаков (а у float их всего семь!). Решение простое: вместо этого выполнять вычисления в формате double :

Пример

Предположим, что вы хотите точно измерить какое-то значение, но ваше измерительное устройство (с неким цифровым дисплеем) показывает только три значимых разряда. Измерение переменной десять раз выдаёт следующий ряд значений:

Чтобы увеличить точность, вы решаете сложить результаты измерений и вычислить среднее значение. В этом примере используется число с плавающей запятой в base-10, у которого точность составляет точно семь десятичных знаков (похоже на 32-битный float ). С тремя значимыми разрядами это даёт нам четыре дополнительных десятичных знака точности:

В сумме уже четыре значимых разряда, с тремя свободными. Что если сложить сотню таких значений? Тогда мы получим нечто вроде такого:

Всё ещё остались два неиспользованных разряда. Если суммировать тысячу чисел?

Пока что всё хорошо, но теперь мы используем все десятичные знаки для точности. Продолжим складывать числа:

Заметьте, как мы сдвигаем меньшее число, чтобы выровнять десятичный разделитель. У нас больше нет запасных разрядов, и мы опасно приблизились к потере точности. Что если сложить сто тысяч значений? Тогда добавление новых значений будет выглядеть так:

Обратите внимание, что последний значимый разряд данных (2 в 3.12) теряется. Вот теперь потеря точности действительно происходит, поскольку мы непрерывно будем игнорировать последний разряд точности наших данных. Мы видим, что проблема возникает после сложения десяти тысяч чисел, но до ста тысяч. У нас есть семь десятичных знаков точности, а в измерениях имеются три значимых разряда. Оставшиеся четыре разряда — это четыре порядка величины, которые выполняют роль своеобразного «числового буфера». Поэтому мы можем безопасно складывать четыре порядка величины = 10000 значений без потери точности, но дальше возникнут проблемы. Поэтому правило следующее:

(Существуют численно стабильные способы сложения большого количества значений. Однако простое переключение с float на double гораздо проще и, вероятно, быстрее).

Выводы

Приложение: Что такое число с плавающей запятой?

Я обнаружил, что многие на самом деле не вникают, что такое числа с плавающей запятой, поэтому есть смысл вкратце объяснить. Я пропущу здесь мельчайшие детали о битах, INF, NaN и поднормалях, а вместо этого покажу несколько примеров чисел с плавающей запятой в base-10. Всё то же самое применимо к двоичным числам.

Вот несколько примеров чисел с плавающей запятой, все с семью десятичными разрядами (это близко к 32-битному float ).

1.875545 · 10^-18 = 0.000 000 000 000 000 001 875 545
3.141593 · 10^0 = 3.141593
2.997925 · 10^8 = 299 792 500
6.022141 · 10^23 = 602 214 100 000 000 000 000 000

Выделенная жирным часть называется мантиссой, а выделенная курсивом — экспонентой. Вкратце, точность хранится в мантиссе, а величина в экспоненте. Так как с ними работать? Ну, умножение производится просто: перемножаем мантисссы и складываем экспоненты:

Сложение немного хитрее: чтобы сложить два числа разной величины, сначала нужно сдвинуть меньшее из двух чисел таким образом, чтобы запятая находилась в одном и том же месте.

Заметьте, как мы сдвинули некоторые из значимых десятичных знаков, чтобы запятые совпадали. Другими словами, мы теряем точность, когда складываем числа разных величин.

Источник

DOUBLE PRECISION

Арифметические операции над смешанными типами с фиксированной и плавающей точкой

Когда бинарная операция (сложение, вычитание, умножение и деление) включает в качестве операндов точные числа и числа с плавающей точкой, то результат будет типа DOUBLE PRECISION.

Следующий оператор создает столбец PERCENT_CHANGE, используя тип DOUBLE PRECISION:

CREATE TABLE SALARY_HISTORY

PERCENT_CHANGE DOUBLE PRECISION

Следующий оператор CREATE TABLE дает пример использования различных числовых типов данных: INTEGER для общего количества заказов, с фиксированной точкой DECIMAL для общей суммы продаж в долларах и FLOAT для скидки к продаже:

CREATE TABLE SALES

CHECK (QTY_ORDERED >=1),

TOTAL_VALUE DECIMAL (9,2)

CHECK (TOTAL_VALUE >= 0),

CHECK (DISCOUNT >= 0 AND DISCOUNT

Читайте также

3.7.4 double

3.7.4 double proc double() < if ($1 >1) < double($1/2) >print($1)>double(1024)

Типы данных float и double

Типы данных float и double В большинстве проектов разработки программного обеспечения оказывается вполне достаточным использовать данные целых типов. Однако в программах вычислительного характера часто применяются числа с плавающей точкой. В языке Си такие данные

6.2 Float и Double

6.2 Float и Double Для выражений float могут выполняться действия арифметки с плавающей точкой одинарной точности. Преобразования меду числами одинарной и двойной точности выполняются настолько математически корректно, насколько позволяет

Источник

CPU vs GPU догоняет потихоньку

Просто результаты сравнительного теста Ryzen 9 3900X и Radeon RX580

AIDA64 GPGPU Benchmark (скромно потупясь, да-да, под оффтопиком запускал, но это непринципиально)

Radeon RX580Ryzen 9 3900X
Memory Read13063 MB/s41410 MB/s
Memory Write12827 MB/s39449 MB/s
Memory Copy186053 MB/s43695 MB/s
Single-Precision FLOPS6264 GFLOPS1579 GFLOPS
Double-Precision FLOPS391.5 GFLOPS789.1 GFLOPS
24-bit integer IOPS6260 GIOPS393.4 GIOPS
32-bit integer IOPS1253 GIOPS393.7 GIOPS
64-bit integer IOPS313.2 GIOPS98.59 GIOPS
AES-25633429 MB/s109151 MB/s
SHA-1 Hash73763 MB/s37069 MB/s
Single-Precision Julia947.4 FPS583.6 FPS
Doble-Precision Mandel74.36 FPS308.1 FPS

Как сказано, на CPU использовался не OpenCL, а специально оптимизированные программы для вычислений, да и карточка уже далеко не топовая, но тем не менее. Видно, что в некоторых случаях CPU даже быстрее, а почти во многих не принципиально отстает.

Особенно интересно, что в таком очень важном для вычислений вопросе как скорость вычислений с плавающей запятой с двойной точностью (64 бита) процессор уже в два раза быстрее обычной карточки.

Топовые процессоры типа TR 3990x наверное и вообще быстрее будут. История развивается по спирали? С CPU начали массивно-параллельные задачи переносить на GPU, но по мере нарастания гонки ядер обычных CPU преимущества вычислений на видеокарте слабеют.

Double precision mandel что это. Смотреть фото Double precision mandel что это. Смотреть картинку Double precision mandel что это. Картинка про Double precision mandel что это. Фото Double precision mandel что это

Double precision mandel что это. Смотреть фото Double precision mandel что это. Смотреть картинку Double precision mandel что это. Картинка про Double precision mandel что это. Фото Double precision mandel что это

Особенно интересно, что в таком очень важном для вычислений вопросе как скорость вычислений с плавающей запятой с двойной точностью (64 бита) процессор уже в два раза быстрее обычной карточки.

Источник

double precision в пиксельном шейдере

На моей GTX 670 демо работает на ура. Мб у тебя проблема с дровами?!

Double precision mandel что это. Смотреть фото Double precision mandel что это. Смотреть картинку Double precision mandel что это. Картинка про Double precision mandel что это. Фото Double precision mandel что это

Где-то слышал что начиная с серии 6xx NVIDIA жутко урезали этот самый double precision, чтобы не конкурировать с серией quaddro. В 5xx серии соотношение было вроде 1/8. Надо было брать молоточек поменьше 🙂

Уже нет. В Титане стоит 1 DPU на каждые 3 SPU, т.е. он должен работать с даблами только в три раза медленнее, чем с флоутами. Это не так плохо, фактически как на Tesla. Раньше (GTX680) один DPU приходился на 24 SPU, т.е. там с даблами работать было практически невозможно. Но, как я сказал, я не вижу что у меня вообще даблы запускаются.

Так приближать фрактал надо, приближать (и довольно долго) чтобы увидеть разницу между float и double надо помасштабировать прилично.

=A=L=X=
Всё верно. Цвет точки во фрактале определяется количеством итераций, т.е. целым числом. В данном случае используется палитра из 100 цветов, об этом говорит значение max_iterations

Так на сайте, откуда я программу взял, картинка выглядит так:

Double precision mandel что это. Смотреть фото Double precision mandel что это. Смотреть картинку Double precision mandel что это. Картинка про Double precision mandel что это. Фото Double precision mandel что это

А у меня они совершенно идентичны. Может надо где-то в дровах включать двойную точность? Есть там «CUDA double precision», у меня там стоит «GeForce GTX Titan» (собственно это единственное значение). Но я не CUDА собираюсь использовать, а выводить прямо шейдером. Короче пока я никакой двойной точности не вижу.

=A=L=X=
> Так приближать фрактал надо, приближать (и довольно долго) чтобы увидеть
> разницу между float и double надо помасштабировать прилично.

Double precision mandel что это. Смотреть фото Double precision mandel что это. Смотреть картинку Double precision mandel что это. Картинка про Double precision mandel что это. Фото Double precision mandel что это

Похоже даблы все же работают.

Вот наконец переделал свои шейдера под даблы и запустил на Титане.
Вот это флоаты:

Double precision mandel что это. Смотреть фото Double precision mandel что это. Смотреть картинку Double precision mandel что это. Картинка про Double precision mandel что это. Фото Double precision mandel что это

А это та же самая картинка в даблах:

Double precision mandel что это. Смотреть фото Double precision mandel что это. Смотреть картинку Double precision mandel что это. Картинка про Double precision mandel что это. Фото Double precision mandel что это

Скорость на даблах падает где-то раза в 3-4. На этой картинке было 5 фреймов против 18.

ну, короче, я так понял, ты потратился зря?

Как раз нет. На 680 эта же картинка падает по тайм-ауту, т.е. отрисовка идет дольше 2 секунд. Титан на даблах по крайней мере раз в 10 быстрее чем 680-я.

так титан это нова самая мощная одночиповая видеокарта, затем возьмут 2 чипа, слепят их вместе и получится 790gtx.

Источник

Число двойной точности

Число́ двойно́й то́чности (Double precision, Double) — компьютерный формат представления чисел, занимающий в памяти две последовательных ячейки (компьютерных слова; в случае 32-битного компьютера — 64 бита или 8 байт). Как правило, обозначает формат числа с плавающей запятой стандарта IEEE 754. Числа с плавающей запятой (двойной/одинарной/четверной точности) поддерживаются сопроцессором (в 80386 выполнен как отдельный модуль, начиная с 80486 является встроенным в главный процессор. Сопроцессор, хотя он сейчас и является частью главного процессора, принято называть FPU — Floating Point Unit, буквально Модуль Плавающей Запятой).

Одним из первых языков программирования, позволявшим использовать числа одинарной и двойной точности с плавающей запятой, был Фортран.

Знак
(11 битов)
Экспонента
(52 бита)
Мантисса
63565548474039323124231615870

Для вычисления экспоненты из 11-ти битного числа вычитается 10-ти битное смещение экспоненты, равное Double precision mandel что это. Смотреть фото Double precision mandel что это. Смотреть картинку Double precision mandel что это. Картинка про Double precision mandel что это. Фото Double precision mandel что это. Для вычисления мантиссы к 1,0 добавляется поле мантиссы в виде дробной части. Число равно произведению мантиссы со знаком на двойку в степени экспоненты.

Примеры чисел двойной точности

Double precision mandel что это. Смотреть фото Double precision mandel что это. Смотреть картинку Double precision mandel что это. Картинка про Double precision mandel что это. Фото Double precision mandel что это

Double precision mandel что это. Смотреть фото Double precision mandel что это. Смотреть картинку Double precision mandel что это. Картинка про Double precision mandel что это. Фото Double precision mandel что это

См. также

Ссылки

Полезное

Смотреть что такое «Число двойной точности» в других словарях:

Число одинарной точности — (англ. Single precision, Single) широко распространенный компьютерный формат представления вещественных чисел, занимающий в памяти 32 бита (4 байта). Как правило, под ним понимают формат числа с плавающей запятой стандарта IEEE 754.… … Википедия

Число четверной точности — (англ. Quadruple precision) компьютерный формат представления чисел с плавающей запятой, занимающий в памяти четыре последовательных ячейки (компьютерных слова; в случае 32 битного компьютера 128 бит или 16 байт). Как правило, обозначает… … Википедия

Число половинной точности — (англ. half precision) компьютерный формат представления чисел, занимающий в памяти половину компьютерного слова (в случае 32 битного компьютера 16 бит или 2 байта). Диапазон значений ± 2−24(5.96E 8) 65504. Приблизительная… … Википедия

Число с плавающей запятой — Число с плавающей запятой форма представления действительных чисел, в которой число хранится в форме мантиссы и показателя степени. При этом число с плавающей запятой имеет фиксированную относительную точность и изменяющуюся абсолютную.… … Википедия

Strtod — (сокр. от string to double, строку в число двойной точности ) функция языка Си, конвертирующая символ строки в число с плавающей запятой двойной точности. Определение функции имеет вид: double strtod ( const char * str, char ** endptr );[1]… … Википедия

strtod — (сокр. от string to double, «строку в число двойной точности») функция языка Си, конвертирующая символ строки в число с плавающей запятой двойной точности. Определение функции имеет вид: double strtod ( const char * str, char ** endptr… … Википедия

stdlib.h — Стандартная библиотека языка программирования С assert.h complex.h ctype.h errno.h fenv.h float.h inttypes.h iso646.h limits.h locale.h math.h setjmp.h signal.h stdarg.h stdbool.h stddef.h stdint.h … Википедия

Числа с плавающей запятой — Плавающая запятая форма представления действительных чисел, в которой число хранится в форме мантиссы и показателя степени. При этом число с плавающей запятой имеет фиксированную относительную точность и изменяющуюся абсолютную. Наиболее… … Википедия

Запятая плавающая — Плавающая запятая форма представления дробных чисел, в которой число хранится в форме мантиссы и показателя степени. При этом число с плавающей запятой имеет фиксированную относительную точность и изменяющуюся абсолютную. Наиболее часто… … Википедия

Машинный эпсилон — Плавающая запятая форма представления дробных чисел, в которой число хранится в форме мантиссы и показателя степени. При этом число с плавающей запятой имеет фиксированную относительную точность и изменяющуюся абсолютную. Наиболее часто… … Википедия

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *