LINUX.ORG.RU

История изменений

Исправление firkax, (текущая версия) :

Вычисляю машинное эпсилон и не получается для 128-битной плавучки его правильно отобразить.

glibc printf может и не поддерживать. В мане нету например. А даже если будет поддерживать - то несовместимо с другими libc. Напиши свой (печатаешь цифру слева от точки, вычитаешь её, умножаешь на 10 и так по циклу).

Понятно, ноль там для __float128 быть не может, это результат какого-то округления при выводе.

Скорее всего не округления даже, а не того типа. Он там ждёт double и интерпретирует полученный байты как double, а ему дают __float128 и хорошо если в том же регистре/месте памяти а не в другом.

Что интереснее, для расчета всегда используется x87-й блок, даже если -mfpmath=sse -msse2

Потому что sse не поддерживает этот тип (у х87 есть три типа: одиночной, двойной и расширенной точности).

3. Для __float128 всегда используется sse2, даже если указано -mfpmath=387

Аналогично, х87 не поддерживает его. Насчёт того как он вообще работает не знаю, мне казалось что предел точности sse это double.

Не понял, как можно заставить использовать avx и avx2

-mfpmath=avx какое-нить?

Исходная версия firkax, :

Вычисляю машинное эпсилон и не получается для 128-битной плавучки его правильно отобразить.

glibc printf может и не поддерживать. В мане нету например. А даже если будет поддерживать - то несовместимо с другими libc. Напиши свой (печатаешь цифру слева от точки, вычитаешь её, умножаешь на 10 и так по циклу).

Что интереснее, для расчета всегда используется x87-й блок, даже если -mfpmath=sse -msse2

Потому что sse не поддерживает этот тип (у х87 есть три типа: одиночной, двойной и расширенной точности).

3. Для __float128 всегда используется sse2, даже если указано -mfpmath=387

Аналогично, х87 не поддерживает его. Насчёт того как он вообще работает не знаю, мне казалось что предел точности sse это double.

Не понял, как можно заставить использовать avx и avx2

-mfpmath=avx какое-нить?