Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Математический ноль, Как он относится моей работе? 
V
    Опции темы
bullvinkle
Дата 5.10.2008, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 18.3.2008

Репутация: нет
Всего: нет



Написал простенькую (первую за всю жизнь на С++) лабу, она считает заданное выражение дважды: используя два типа переменных float и double. Обязательным условием было использовать дополнительные переменные: сколько действий  - столько и переменных.
Результаты отличаются друг от друга и препод требует это объяснить.
Объяснения типа ".....а там округляется." преп не принимает.
Говорит объяснить ему что такое математический ноль, как происходит сложение чисел и как это все относится к моей лабе. И обязательно таким языком, что бы меня понял каждый школьник. 
Кто понимает как это сделать, объясните мне пожалуйста.

Код

#include <iostream.h>
#include <math.h>
#include <stdio.h>
int main()
{
double a=1000.0;
double b=0.0001;
double c, d, e, f, g;
c=a+b;
d=pow(c,3);
e=a*a*a-3.0*a*b*b;
f=b*b*b-3.0*a*a*b;
g=(d-e)/f;
//////////////////////////////////////////////
float x = 1000.0;
float y = 0.0001;
float h,i,j,k,l;
h=x+y;
i=pow(h,3);
j=x*x*x-3.0*x*y*y;
k=y*y*y-3.0*x*x*y;
l=(i-j)/f;
/////////////////////////////////////////////
cout << "If you use float the answer is: " << l <<endl;
cout << "The answer with double is: " << g <<endl;
getchar();
return 0;
}


Результат:
If you use float the answer is: -1.28
The answer with double is: -1

Это сообщение отредактировал(а) bullvinkle - 5.10.2008, 17:55
PM MAIL ICQ   Вверх
mes
Дата 5.10.2008, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(bullvinkle @  5.10.2008,  17:02 Найти цитируемый пост)
If you use float the answer is: -128
The answer with double is: -1 

может - 1.28 smile

вот так код нагляднее будет
Код


#include <iostream>
#include <math.h>

template <class T> T my_func ()
{
    T a=1000.0;
    T b=0.0001;
    T c, d, e, f, g;
    c=a+b;
    d=pow(c,3);
    e=a*a*a-3.0*a*b*b;
    f=b*b*b-3.0*a*a*b;
    g=(d-e)/f;
    return g;
};

int main()
{

std::cout << "If you use float the answer is: " <<  my_func<float>() <<std::endl;
std::cout << "The answer with double is: " <<  my_func<double>() <<std::endl;
getchar();
return 0;
}



а эффект из за разной точности double и float.

Цитата(bullvinkle @  5.10.2008,  17:02 Найти цитируемый пост)
что такое математический ноль

http://ru.wikipedia.org/wiki/%D0%9E%D1%82%...%BE%D0%BB%D1%8C

Это сообщение отредактировал(а) mes - 5.10.2008, 17:59


--------------------
PM MAIL WWW   Вверх
bullvinkle
Дата 5.10.2008, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 18.3.2008

Репутация: нет
Всего: нет



Mes ошибку в результате исправил, спасибо.
Да, твой код по точнее и по компактнее будет, но от меня пока этого не требуется.
О том что точность разная я говорил, но поскольку препод в прошлом семестре преподавал нам архитектуру ЭВМ ему такого ответа мало.
Вот если бы мне кто то объяснил про математический ноль (определение с википедии я знаю, но этого мало) и как вобще он относится к моей лабе.
Кстати если не использовать промежуточных переменных, то результаты в обеих случаях одинаковые. Какой из этого можно сделать вывод?
PM MAIL ICQ   Вверх
korian
Дата 5.10.2008, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 2
Всего: 17



Цитата(bullvinkle @  5.10.2008,  17:03 Найти цитируемый пост)
Кстати если не использовать промежуточных переменных, то результаты в обеих случаях одинаковые. Какой из этого можно сделать вывод?

вывод тут один: промежуточные вычисления производятся в double
и нормальные компиляторы на строки:
Код

j=x*x*x-3.0*x*y*y;
k=y*y*y-3.0*x*x*y;
l=(i-j)/f;

выдают предупреждение:
warning C4244: '=' : conversion from 'double' to 'float', possible loss of data

Числа с плавающей запятой
float предоставляет точность максимум до 7 знаков.
для вычисления операции:
i=pow(h,3);
без потерь, необходима большая точность, здесь и происходят основные потери.

PM   Вверх
J0ker
Дата 6.10.2008, 03:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14





--------------------
user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1012 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.