Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Нужно больше точности  (Прочитано 10068 раз)
0 Пользователей и 1 Гость смотрят эту тему.
homosapien
Интересующийся

de
Offline Offline

« : 20-02-2010 00:23 » 

Пишу некоторое приложение на на сях, точности float не хватает, после 5 знаков после запятой всё округляется. Как быть?
Записан
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #1 : 20-02-2010 02:03 » 

double - наш выбор
Записан

С уважением Lapulya
homosapien
Интересующийся

de
Offline Offline

« Ответ #2 : 20-02-2010 02:35 » 

с double тотже эффект, если вы не в курсе Улыбаюсь
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 20-02-2010 04:20 » 

homosapien, дело, значит, не в типе, а в кривизне Улыбаюсь Показывай код
Записан

RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 20-02-2010 10:38 » 

homosapien, если вы не в курсе, float и double - значения стандарта IEEE-754, со всеми вытекающими достоинствами и недостатками. Тип float имеет мантису 24 бита, что после конверсии в десятичный текст дает точность 7 знаков (не после запятой, а цифр всего!). Тип double имеет мантису 53 бита, что дает 15 десятичных знаков.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #5 : 20-02-2010 11:13 » 

А может ему 15 мало? Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 20-02-2010 11:35 » 

Жень, он говорит "после 5 знаков после запятой всё округляется" и "с double тотже эффект".
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
homosapien
Интересующийся

de
Offline Offline

« Ответ #7 : 20-02-2010 12:32 » 

homosapien, если вы не в курсе, float и double - значения стандарта IEEE-754, со всеми вытекающими достоинствами и недостатками. Тип float имеет мантису 24 бита, что после конверсии в десятичный текст дает точность 7 знаков (не после запятой, а цифр всего!). Тип double имеет мантису 53 бита, что дает 15 десятичных знаков.

окей, ты прав. Но почему тогда код вроде такого считает только до 5ти закнов?
Код:
#include <iostream>
using namespace std;
int main( int argc, char *argv[])
{
double x,x1 = 0;
cout << "int to start: " << endl;
cin >> x;
//f(x) = x^2 - 3
for(int i=1; i < 101; i++)
{
x1 = x - ((x*x-3)/(2*x));
x=x1;
cout << "approximation " << i << " x = " << x1 << endl;
}
return 0;
}
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 20-02-2010 14:34 » 

Код:
cout.precision(15);

По умолчанию точность - 6 знаков. Всего шесть знаков, а не после запятой!

По этому считаю систему IO C++ убогой - лучше пользоваться семейством printf/scanf из стандартной библиотеки Си.
« Последнее редактирование: 20-02-2010 14:36 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 20-02-2010 14:35 » 

homosapien, а погрешности кто за тебя считать будет? Проблема не в типе, а в избранном методе вычисления. Если есть разность, то может наблюдаться и такое явление, как "потеря точности" (если вычитаемые значения близки).
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
homosapien
Интересующийся

de
Offline Offline

« Ответ #10 : 20-02-2010 14:49 » 

Код:
cout.precision(15);

По умолчанию точность - 6 знаков. Всего шесть знаков, а не после запятой!

По этому считаю систему IO C++ убогой - лучше пользоваться семейством printf/scanf из стандартной библиотеки Си.
хех, я думал побыстрее для наглядности проверить, поэтому так написал. А оно вот как оказывается...  Спасибо, не знал про это.
homosapien, а погрешности кто за тебя считать будет? Проблема не в типе, а в избранном методе вычисления. Если есть разность, то может наблюдаться и такое явление, как "потеря точности" (если вычитаемые значения близки).
Спасибо, не знал про такое. А как бороться?
added
угу, так на одно число больше выходит после зпт, ежели на стандартных си ф-циях. Но видимо из-за этой погрешности всё равно не намного лучше результат.
« Последнее редактирование: 20-02-2010 14:59 от homosapien » Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #11 : 20-02-2010 18:42 » 

homosapien, Если не секрет, что именно ты считаеш, что 5 знаков после запятой, маловато будет? Я лично в своей практике очень редко применяю цифры с плавающей запятой.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
homosapien
Интересующийся

de
Offline Offline

« Ответ #12 : 20-02-2010 23:06 » new

http://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%9D%D1%8C%D1%8E%D1%82%D0%BE%D0%BD%D0%B0 хочу написать ф-цию для вот этой штуки. И хочу чтобы всё поточнее считалось.
я понимаю, что это велосипед, но хочу сам написать.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines