Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.86/29: Рейтинг темы: голосов - 29, средняя оценка - 4.86
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826

Переполнение типа с плавающей точкой

23.09.2016, 17:12. Показов 6231. Ответов 35
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер,

существует ли понятие переполнение float c UB как полагается?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.09.2016, 17:12
Ответы с готовыми решениями:

Непонятки с плавающей точкой
Обучаюсь С++ по книге Дейтелов. Работаю в IDE Dev-c++ v4.9.9.2 в четвертой главе есть вот такое вот упражнение:4.16. Разработайте...

Почему показывает ошибку переполнение числа с плавающей запятой?
Задание в прикрепленном файле #include <vcl.h> #include <iostream.h> #include <stdlib.h> #include <math.h> #pragma hdrstop ...

Разделитель в числах с плавающей точкой
Здравствуйте, у меня есть интересный вопрос :) Всем известно, что в переменной типа double могут храниться такие числа, как 0.30, но...

35
27.09.2016, 10:13
Студворк — интернет-сервис помощи студентам

Не по теме:

Цитата Сообщение от GbaLog- Посмотреть сообщение
А что это вообще?
Недопустимое значение, может быть?
Ну да :)

Вообще полезно знать о том, как числа с плавающей запятой хранятся в памяти компьютера. Что такое мантисса, ее порядок. Это не просто набор бит, как у целочисленных, с первым битом в качестве знака. У целочисленных, кстати -0 не бывает, только +0 :D Именно за счет этого char это как правило +127..-128, а не +127..-127. И про NaN из той же степени. Думаю гугл и википедия объяснят лучше меня что это такое :D

0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
27.09.2016, 10:32

Не по теме:

Цитата Сообщение от pav1uxa Посмотреть сообщение
Вообще полезно знать о том, как числа с плавающей запятой хранятся в памяти компьютера.
Я это у кого-то в блоге видел, но сейчас уже вряд ли найти. :(
Цитата Сообщение от pav1uxa Посмотреть сообщение
Думаю гугл и википедия объяснят лучше меня что это такое
На счёт лучше или не лучше не уверен, а вот то, что они могут, это правда. :Da



Добавлено через 9 минут

Не по теме:

Цитата Сообщение от GbaLog- Посмотреть сообщение
Я это у кого-то в блоге видел, но сейчас уже вряд ли найти.
Нашёл. Скину, вдруг зашедшему сюда через пару лет человеку захочется прочесть. :)

0
694 / 304 / 99
Регистрация: 04.07.2014
Сообщений: 851
27.09.2016, 10:32
Ну есть ещё такое:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
 
int main() {
  float sum1 = 0;
  double sum2 = 0;
 
  for(size_t i=0; i<1000000000; ++i) {
    sum1 += 123456.0;
    sum2 += 123456.0;
  }
 
  printf("sum1 = %15f\nsum2 = %15f\n", sum1, sum2);
}
https://ru.wikipedia.org/wiki/... 0%BD%D0%B0
2
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
27.09.2016, 11:01
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
а обещали помочь ((((
Не знаю насколько данный пример будет корректен, пусть кто-нибудь поправит если я что-то упустил.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <iomanip>
#include <cmath>
 
int main()
{
    const float pi = 3.1415926535897932384626433832795f;
 
    float a = 0;
    std::cout << std::setw( 9 ) << cos( a ) << std::endl; //  1
    a += pi;
    std::cout << std::setw( 9 ) << cos( a ) << std::endl; // -1
 
    a = pi * 1000000;
    std::cout << std::setw( 9 ) << cos( a ) << std::endl; //  0.995356
    a += pi;
    std::cout << std::setw( 9 ) << cos( a ) << std::endl; // -0.979098
 
    a = pi * 10000 * 10000;
    std::cout << std::setw( 9 ) << cos( a ) << std::endl; //  0.210237
    a += pi;
    std::cout << std::setw( 9 ) << cos( a ) << std::endl; //  0.210237
}
Последние два значения должны быть с разными знаками. Возможно тут играет роль не само переполнение а потеря точности.
rikimaru2013, вы говорили про такое UB?
1
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
27.09.2016, 11:12  [ТС]
castaway, да не, про UB что вроде бы signed фундаментальные типы в С++ при их переполнении UB. Стандарт не гарантирует, что будет - и такой код на разных платформах может повести себя по разному
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
27.09.2016, 11:23
rikimaru2013, ну тогда если вопрос только в этом:
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
существует ли понятие переполнение float c UB как полагается?
то в стандартной библиотеке есть такое понятие (см. сообщение №2).
1
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
27.09.2016, 11:31
Kukuxumushu уже дал подробный ответ.

У чисел с плавающей запятой нет никаких переполнений и UB - там есть NaN, +INF, -INF...
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
27.09.2016, 11:40
pav1uxa, если нет никаких переполнений, тогда на что указывает функция std::fetestexcept( FE_OVERFLOW ):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <cfenv>
#include <iostream>
 
int main() {
    double a = 1000;
    for ( int i = 0; i < 15; ++i ) {
        std::feclearexcept( FE_OVERFLOW );
        a *= a;
        if ( std::fetestexcept( FE_OVERFLOW ) ) {
            std::cout << "Overflow at i = " << i << std::endl;
            break;
        }
    }
}
?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
27.09.2016, 13:00
Цитата Сообщение от GbaLog- Посмотреть сообщение
Странно видеть такой значок перед 0, ведь по идее 0 не может быть с минусом, ну, это нам так на математике в школе говорили.
В алгебре, в теории пределов и дифференциальном исчислении есть. Например для функции y=|x| нет производной в точке 0. Есть производная в точке -0 (это ноль и левая полуокрестность) и есть производная в точке +0 (соответственно). И они не равны друг другу. То что точка 0 состоит из двух штук, это печаль не большая, так как точка не имеет размеров и может быть без вреда разделена на любое конечное количество точек. Любая часть равна целому. Это у всех точек кроме нуля так. А вот ноль делится строго пополам!
1
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
27.09.2016, 13:02
Цитата Сообщение от castaway Посмотреть сообщение
если нет никаких переполнений, тогда на что указывает функция std::fetestexcept( FE_OVERFLOW ):
Я не знаю на что она указывает, я вот запустил Ваш код и он ничего не делает

Но дело то не в этом.

Автор говорит, что если переполнить целочисленный знаковый тип, то неизвестно - чем станет переменная. То есть, если к типу char, равному +127 (01111111), прибавить единицу, то неизвестно чем он станет. Либо -128 (10000000), либо 0 (00000000), либо еще чем то.

А когда Вы переполняете double, то тут нет никаких UB. Он совершенно ясно станет std::numeric_limits<double>::infinity().

C++
1
2
3
4
5
6
7
8
#include <iostream>
#include <limits>
 
int main()
{
    double max = std::numeric_limits<double>::max();
    std::cout << max << '\n' << max*2;
}
Code
1
2
1.79769e+308
inf
0
27.09.2016, 13:15

Не по теме:

IGPIGP, Теперь придётся лёд к голове прикладывать, зачем вы так? :swoon:

0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
27.09.2016, 13:22
Цитата Сообщение от pav1uxa Посмотреть сообщение
А когда Вы переполняете double, то тут нет никаких UB.
Про UB я не берусь говорить что-то конкретное, я лишь хотел сказать о том что термин "переполнение" существует в стандартной библиотеке.
Конечно же не стоит сравнивать целочисленное переполнение и переполнение чисел с плавающей точкой, это всё-таки немного разное...
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
27.09.2016, 14:24
Цитата Сообщение от pav1uxa Посмотреть сообщение
А когда Вы переполняете double, то тут нет никаких UB. Он совершенно ясно станет std::numeric_limits<double>::infinity().
Не, совершенно неясно! Дело в том, что стандарт не требует, чтобы типы с плавающей точкой соответствовали какому-либо стандарту. Проверить на соответствие стандарту IEEE 754 можно через константу std::numeric_limits<T>::is_iec559. Если соответствует этому стандарту, то там есть и бесконечность, и NaN, если же нет, то ничего не гарантируется. Проверить на существование бесконечности можно через константу std::numeric_limits<T>::has_infinity.

Добавлено через 2 минуты
Цитата Сообщение от pav1uxa Посмотреть сообщение
я вот запустил Ваш код и он ничего не делает
А С++11 подключили? Это из нового стандарта.
Кстати, если в коде использовать эти функции, то он станет платформозависимым.
0
27.09.2016, 14:34

Не по теме:

Цитата Сообщение от Mr.X Посмотреть сообщение
А С++11 подключили? Это из нового стандарта.
Да. А программа собралась бы иначе?

0
27.09.2016, 14:42

Не по теме:

GbaLog-, немного не в тему, сам честно не помню, но в пределах по-моему есть понятие -0 и +0

0
27.09.2016, 18:48

Не по теме:

Цитата Сообщение от GbaLog- Посмотреть сообщение
IGPIGP, Теперь придётся лёд к голове прикладывать, зачем вы так?
Хотел повеселить. :)
Цитата Сообщение от obivan Посмотреть сообщение
GbaLog-, немного не в тему, сам честно не помню, но в пределах по-моему есть понятие -0 и +0
Да. Когда x->a оказывается, что порой, это не безразлично, - откуда он стремится: слева или справа. Тогда и возникают полуокрестности и для простоты говорят, что х стремится к плюс ноль, например. Хотя имеют ввиду, что он стремится справа. Но если поехидничать, то можно представить, как х стремится слева аж через минус ноль к плюс ноль. Проходя через ноль. Классическая механика не состоятельна для иллюстрации подобных вещей. Уравнения Шрёдингера - самое то. :)

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.09.2016, 18:48

Типы данных с плавающей точкой
Есть какие-нибудь типы данных фиксированной длины, вроде int16_t или __u16, но для работы с плавающей точкой? Вроде бы __fp32...

Точность числа с плавающей точкой
У типа float числа одинарной точности с плавающей запятой обеспечивают относительную точность 7-8 десятичных цифр. Внимание, вопрос!...

Сравнение чисел с плавающей точкой
Известно, что числа с плавающей точкой нельзя сравнивать с помощью ==. Однако, нет ли исключения из этого правила? Дело вот в чём. Если мы...

Вывод числа с плавающей точкой
Доброго всем времени суток. Пытаюсь вывести число с плавающей запятой на LCD. long int Eb = 0x5959; char st_Ebf =...

Форматирование чисел с плавающей точкой
Все знают про проблемы с представлением дробных чисел. Например: double test = .58; printf(&quot;%f\n&quot;, test); ...


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

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
Новые блоги и статьи
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
Более приземисто - Эстафету хвоста в .cdl (деревья эстафеты в сад).
Hrethgir 24.07.2026
В будущем, после написания блока инверсии обхода дерева (эстафеты хвоста), я планирую вернуться к нашему прошлому разговору о том, обладают ли знания целеполаганием. Тогда я пришел к выводу, что. . .
Вот представьте что вам дали бессмертие.
kumehtar 24.07.2026
Вот представьте что вам дали бессмертие, ничего более не меняя. Вообще ничего, только бессмертие в нынешнем виде. Рады были бы? Что бы вы тут делали всё это время? Никакой пенсии. Никакого нового. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru