Нарушающий
408 / 296 / 46
Регистрация: 13.04.2022
Сообщений: 1,722
1

Как понять точность вычислений в gcc/g++ на х86

20.05.2022, 06:46. Показов 1047. Ответов 6
Метки нет (Все метки)

Мой компилятор (amd64/mint, вариант убунты семейства дебиан) поддерживает плавающую точку:

double - 64 бита (52+1бит мантисса) - с этим все понятно, IEEE стандарт
long double - занимает 128 бит. Но по-моему, хранит только 80 бит, минимальная рекомендация С99.
Т.е это НЕ "IEEE/quadruple precision", у которого 112+1 бит мантиссы.

По-моему, х86 силикон процессоров поддерживает только 80-битовые, поэтому все выражения с плавающей точкой
расширяются то 80 бит, считаются и для double округляются при сохранении в переменную.

Кто-то разбирался в этом более подробно? У меня нет уверенности что я все понимаю правильно с этими long double на x86.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.05.2022, 06:46
Ответы с готовыми решениями:

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

Точность вычислений
Здравствуйте! Проблема примерно такого плана: мне надо найти точку, которая ближе всего лежит к...

Точность вычислений 10^30 - 10^(-30)
Здравствуйте, скажите пожалуйста, можно ли в какой либо программе, или на супер компьютере...

Точность вычислений
Здравствуйте уважаемые форумчане. Если в матлабе вычислить такое выражение 0.05+0.001 == 0.051 ...

6
Нарушитель
7661 / 4220 / 972
Регистрация: 12.03.2015
Сообщений: 19,727
20.05.2022, 08:38 2
Just run it:
C++
1
2
3
4
5
6
7
8
#include <iostream>
using namespace std;
 
int main()
{
  cout << "  sizeof(long double) = " << sizeof(long double);
  return 0;
}
0
Don't worry, be happy
17769 / 10534 / 2034
Регистрация: 27.09.2012
Сообщений: 26,505
Записей в блоге: 1
20.05.2022, 10:56 3
long double - extended precision floating-point type. Matches IEEE-754 binary128 format if supported, otherwise matches IEEE-754 binary64-extended format if supported, otherwise matches some non-IEEE-754 extended floating-point format as long as its precision is better than binary64 and range is at least as good as binary64, otherwise matches IEEE-754 binary64 format.
binary128 format is used by some HP-UX, SPARC, MIPS, ARM64, and z/OS implementations.
The most well known IEEE-754 binary64-extended format is 80-bit x87 extended precision format. It is used by many x86 and x86-64 implementations (a notable exception is MSVC, which implements long double in the same format as double, i.e. binary64).
https://en.cppreference.com/w/cpp/language/types



Ну а стандарт языка гласит
The three distinct types float, double, and long double can represent floating-point numbers. The type double provides at least as much precision as float, and the type long double provides at least as much precision as double. The set of values of the type float is a subset of the set of values of the type double; the set of values of the type double is a subset of the set of values of the type long double. The types float, double, and long double, and cv-qualified versions ([basic.type.qualifier]) thereof, are collectively termed floating-point types. The value representation of floating-point types is implementation-defined.
[Note 9: This document imposes no requirements on the accuracy of floating-point operations; see also [support.limits]. — end note]
https://eel.is/c++draft/basic.fundamental#12
0
Нарушающий
408 / 296 / 46
Регистрация: 13.04.2022
Сообщений: 1,722
20.05.2022, 19:13  [ТС] 4
Цитата Сообщение от Verevkin Посмотреть сообщение
Just run it: .. sizeof()
Это дает размер памяти которы занимает переменная.
Из соображений выравнивания переменные в которых менее 128 значимых бит могут занимать все 128 бит.
Так пишет Вики, и это так и оказалось в моем случае.

Добавлено через 10 минут
Croessmah, я прочитал эту статью, к сожалению она не говорит о моем конкретном компиляторе.
Говорится что 80-битовый формат самый популярный на х86, т.к. аппаратная поддержка.

У меня sizeof(long double) = 16, но сложение происходит вроде бы по 80-битным правилам, т.к скорее всего использует встроенные х87 команды.

Есть ли готовый тест который скажет что-то вроде:
- ваш long double занимает 16 байт, но хранится согласно 10-байтовому стандарту
- 80-бит это потолок, т.е. ничего точнее 80-битовой ни при встроенных операциях ни в стандартных мат. функциях
- все операнды ниже 80-бит сначала расширяются до 80-битовой точности для мат. операций
- обычный double это 64 бита, и когда туда записывается 80-битный результат, он округляется а не отсекается.

Т.е. тест который дает гарантии программисту на сколько именно знаков он может рассчитывать при правильном программировании.

Добавлено через 2 часа 7 минут
Не стал ждать, написал программу.

Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
#include <math.h>
 
int main()
{
  int n = 0;
  for( float x = 1 ; 1+x > 1 ; ++n, x /= 2 ) ;
  printf( "float: size=%u bytes, mantissa: %u bits\n", (int)sizeof(float), n-1 );
 
  n = 0;
  for( double x = 1 ; 1+x > 1 ; ++n, x /= 2 );
  printf( "double: size=%u bytes, mantissa: %u bits\n", (int)sizeof(double), n-1 );
 
  n = 0;
  for( long double x = 1 ; 1+x > 1 ; ++n, x /= 2 ) ;
    
  printf( "long double: size=%u bytes, mantissa: %u bits\n", (int)sizeof(long double), n-1 );
 
  long double dd = 2*acosl(0);
  for( int i = sizeof( dd ) ; i-- ; )
    printf( "%02x", ((unsigned char*)&dd)[i] );
  printf( "\npi=%.30Lf\n", dd );
 
  return 0;
}


Пишет для моего компилятора:
float: size=4 bytes, mantissa: 23 bits
double: size=8 bytes, mantissa: 52 bits
long double: size=16 bytes, mantissa: 63 bits
0000558595b34000c90fdaa22168c235
pi=3.141592653589793238512808959406

Прикольно что старшие шесть байт (красным) которые обеспечивают выравнивание не очищаются, в них мусор из стэка.
0
Нарушитель
7661 / 4220 / 972
Регистрация: 12.03.2015
Сообщений: 19,727
20.05.2022, 19:18 5
Цитата Сообщение от QueryMonkey Посмотреть сообщение
Прикольно что старшие шесть байт (красным) которые обеспечивают выравнивание не очищаются, в них мусор из стэка.


Ваши предложения, сер?
Какая точность тебе НУЖНА?
0
Нарушающий
408 / 296 / 46
Регистрация: 13.04.2022
Сообщений: 1,722
20.05.2022, 20:04  [ТС] 6
Verevkin, мне нужно узнать что может дать мой компилятор.

И я теперь знаю. Он может 64-битную мантиссу, что примерно 19 десятичных знаков.

128-битную не может.

В вашем компиляторе ответ может быть другим, поэтому результат вычислений не совпадет.
0
16284 / 8841 / 2168
Регистрация: 30.01.2014
Сообщений: 15,285
21.05.2022, 16:42 7
Лучший ответ Сообщение было отмечено QueryMonkey как решение

Решение

Цитата Сообщение от QueryMonkey Посмотреть сообщение
мне нужно узнать что может дать мой компилятор.
https://gcc.gnu.org/wiki/FloatingPointMath
https://gcc.gnu.org/onlinedocs... Types.html
https://gcc.gnu.org/onlinedocs... ision.html
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.05.2022, 16:42
Помогаю со студенческими работами здесь

Точность вычислений
Почему в программе при написании float A = 28.8; float B = 19.6;в отлатчике видим A =...

точность вычислений
Известно что в Питоне: 1.001 + 5 = 6.0009999999999994 А хочется чтобы было 6.001 ...

Точность вычислений
Для проверки точности вычислений существуют формулы и калькулятор на 200000 знаков до и после...

Плохая точность вычислений
Добрый день! Помогите, пожалуйста. Нужно решить уравнение y=A*x относительно x. Но почему-то...

Точность вычислений до сотых
Имеется следующий код, который вычисляет интеграл (с использованием omp). Каким образом...

Точность вычислений выражений C++
Здравствуйте! Такой вопрос. Есть два выражения: double a,b; a=1+f(x) b=1+g(x) Нужно вывести...

Точность вычислений у double
Дана задача: &quot;Определить, на сколько нулей заканчивается факториал числа n&quot;. Пример: вводим &quot;25&quot;,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru