Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.74/103: Рейтинг темы: голосов - 103, средняя оценка - 4.74
-47 / 3 / 0
Регистрация: 31.12.2017
Сообщений: 204
1

Диапазон значений float

14.01.2018, 18:11. Показов 21141. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Тип float способен хранить числа, содержащиеся в интервале от https://www.cyberforum.ru/cgi-bin/latex.cgi?3.4 \cdot 10^{-38} до https://www.cyberforum.ru/cgi-bin/latex.cgi?3.4 \cdot 10^{38}, с точностью до семи знаков после запятой.
Что я не понял, ведь https://www.cyberforum.ru/cgi-bin/latex.cgi?3.4 \cdot 10^{-38}=0.\underbrace{00000...0}_{37}34. Если этот диапазон реально поддерживается, значит точность должна быть 37 знаков после запятой. Почему же сказано, что до семи?

Добавлено через 5 минут
Из этой же цитаты следует, что тип float не предназначен для работы с отрицательными числами. Это правда?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.01.2018, 18:11
Ответы с готовыми решениями:

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

Почему диапазон значений у типа float больше, чем у типа int, если они оба занимают 4 байта?
Почему диапазон значений флоат больше чем у инта, если они оба занимают 4 байта? Вроде слышал...

Разработать функцию, в которую передается массив типа float, что возвращает сумму элементов массива в диапазон
Разработать функцию, в которую передается массив типа float, что возвращает сумму элементов массива...

опять ошибка.на этот раз cannot convert `float (*)(float)' to `float' in argument passing
#include<stdio.h> #include<stdlib.h> #include<math.h> float f1(float x)/*vira*enie 1*/ ...

12
192 / 128 / 52
Регистрация: 19.01.2010
Сообщений: 518
14.01.2018, 18:14 2
из-за ограниченного количества бит мантиссы и порядка, изменение флотА происходит с точностью до 7 знаков. Т.е шаг с точностью 10е-7
0
Evg
Эксперт CАвтор FAQ
21280 / 8303 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
14.01.2018, 18:15 3
Цитата Сообщение от Jzx Посмотреть сообщение
Почему же сказано, что до семи?
Потому что тест писал человек, скорее всего реально не понимающий, как устроено хранение вещественных чисел в машине

Цитата Сообщение от Jzx Посмотреть сообщение
Из этой же цитаты следует, что тип float не предназначен для работы с отрицательными числами. Это правда?
Конечно же нет
0
20 / 20 / 6
Регистрация: 16.11.2017
Сообщений: 87
14.01.2018, 18:19 4
Отрицательные числа во float - без проблем.
число представляется 2 кусками - значащие цифры (мантисса) и степень (экспонента) пусть будет 10-ки, на которую умножается мантисса. Так вот, точность 7 знаков - это мантисса. их можно умножать на 10 в 37, т.е. "двигать" вправо-влево от точки. А сама точность при этом остается 7 знаков.

Очень грубо и примерно написал, но принцип думаю понятен.
0
-47 / 3 / 0
Регистрация: 31.12.2017
Сообщений: 204
14.01.2018, 18:22  [ТС] 5
Я изготовил примерчик:
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <cstdlib>
using namespace std;
 
int main(){
    float rad;
    cin >> rad;
    cout<< rad;
    system("pause");
    return 0;
}
Если после запуска ввести число https://www.cyberforum.ru/cgi-bin/latex.cgi?-11.1234567890, программа выводит https://www.cyberforum.ru/cgi-bin/latex.cgi?-11.1235
То есть гарантируется точность только трех цифр после запятой и округляется четвертая, верно?

Evg, ну, а какой реальный диапазон значений?
0
20 / 20 / 6
Регистрация: 16.11.2017
Сообщений: 87
14.01.2018, 18:27 6
Программа выводит с округлением, используйте setprecision, чтобы установить сколько знаков вы хотите вывести.
0
-47 / 3 / 0
Регистрация: 31.12.2017
Сообщений: 204
14.01.2018, 18:31  [ТС] 7
Программа выводит с округлением
Точность всегда до 4 цифры? Или она зависит от компилятора?
0
Evg
Эксперт CАвтор FAQ
21280 / 8303 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
14.01.2018, 18:51 8
Лучший ответ Сообщение было отмечено MrGluck как решение

Решение

Цитата Сообщение от Jzx Посмотреть сообщение
Если после запуска ввести число , программа выводит
Что напечатается - зависит от того, с какой точностью попросят напечатать, поскольку числа в машине хранятся в двоичном представлении и в десятичное в основном переводятся неточно. Какая настройка по умолчанию, я не помню

https://ideone.com/GVJfvs

Цитата Сообщение от Jzx Посмотреть сообщение
Evg, ну, а какой реальный диапазон значений?
Диапазон такой, как и указано, только числа в этом диапазоне находятся неравномерно

Почитай тут, может какая-то ясность появится: https://www.cyberforum.ru/blogs/18334/blog88.html

Добавлено через 8 минут
float занимает 4 байта, т.е. 32 бита. А в 32 бита можно записать 2^32 (~4 млрд) различных комбинаций. Т.е. столько различных значений можно хранить в 32-битном float'е. Половина этих значений соответствует положительным числам, половина отрицательным (т.е. примерно по 2 млрд каждых). 2 млрд например, положительных, различных значений размазаны НЕравномерно по диапазону от 10^-38 до 10^+38. Маленькие (по модулю) числа представлены с большим абсолютным значением точности, большие числа - с меньшей точностью

Если построить логарифмическую шкалу, то все возможные значения, который хранит float, будут расположены равномерно. Т.е. равномерность соблюдается в логарифмическом масштабе
1
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
14.01.2018, 19:19 9
Цитата Сообщение от Evg Посмотреть сообщение
поскольку числа в машине хранятся в двоичном представлении и в десятичное в основном переводятся неточно
Не совсем так. Целые числа можно хранить вне зависимости от представления, и своё значение они сохранят. Тут дело в том, что степень числа хранится для 2ки. А преобразовать 2^n к числу 10^m без ошибок невозможно (для знающих математику - из за того что https://www.cyberforum.ru/cgi-bin/latex.cgi?{log}_{2}10 является тансцендентным числом). И данная ошибка домножается на мантису, потому и "число с плавающей точкой" оказывается то больше то меньше присвоенного в десятичном виде.

Добавлено через 4 минуты
А ошибки в точности при делении будут и у целых чисел тоже. А в случае переполнения даже для сложения/вычитания/умножения.
0
-47 / 3 / 0
Регистрация: 31.12.2017
Сообщений: 204
14.01.2018, 19:49  [ТС] 10
TRam_, значит, потеря точности появляется в момент вывода на экран? А если над числами выполнять арифметические действия, то они будут выполнены в двоичной системе, и результат этих действий сохранится в двоичном представлении?
0
Evg
Эксперт CАвтор FAQ
21280 / 8303 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
14.01.2018, 20:25 11
Цитата Сообщение от Jzx Посмотреть сообщение
потеря точности появляется в момент вывода на экран?
Да, если число точно в десятичной системе не представляется

Цитата Сообщение от Jzx Посмотреть сообщение
А если над числами выполнять арифметические действия, то они будут выполнены в двоичной системе, и результат этих действий сохранится в двоичном представлении?
Да. Но в процессе вычислений так же возможны потери точности, которые происходят из-за того, что float может хранить только набор из 4 млрд чисел, а потому число, являющееся результатом операции, может и не попасть в это множество из 4 млрд чисел
0
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
14.01.2018, 22:33 12
Цитата Сообщение от Jzx Посмотреть сообщение
потеря точности появляется в момент вывода на экран?
В момент преобразования буфера ввода (с нажатыми тобой для ввода числа клавишами) в записываемое в переменную значение.
1
Evg
14.01.2018, 23:54     Диапазон значений float
  #13

Не по теме:

Цитата Сообщение от TRam_ Посмотреть сообщение
В момент преобразования буфера ввода
Кстати, да, в этом месте потеря происходит ещё раньше, чем при выводе

0
14.01.2018, 23:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.01.2018, 23:54
Помогаю со студенческими работами здесь

Диапазон значений
Числу B нужно присвоить значение в зависимости от того, какое значение у числа А, но проблема в...

Диапазон значений в switch
Доброго времени суток. Совсем детский вопрос наверное, но. Как сделать в кейсе диапазон значений,...

Диапазон значений указателей
Здравствуйте! Подскажите пожалуйста, как узнать ограничения на значение указателей в системе?

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

Диапазон значений массива.
Подскажите, пожалуйста, не пойму задачи. В программе из листинга указан же диапазон, и ar...

Как проверить диапазон значений?
Как в С++ проверить диапазон значений. например : 0&lt;=k&lt;=35.


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru