The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Индекс форумов
Составление сообщения

Исходное сообщение
"Помогите! Как избавится от ошибок вычислений процессора?"
Отправлено AlexRoot, 07-Мрт-05 04:12 
Спасибо за Ваши рекомендации и замечания. Но, всеже, с посторонней помощью была Нами написана функция округления double до заданной точностью. Ошибок в этой функции не обнаружено. Очень хотелось бы знать, как Вы считаете, возможно ли пользоваться этой функцией, или нет, и почему? Повторюсь, функция РАБОТЕТ КОРРЕКТНО. ОШИБОК Я НЕ ЗАМЕЧАЛ.
Спасибо за ваши комментарии.
С уважением, Александр.

Ниже приводится сама функция.

#include "StdAfx.h"
#include "okryglenie.h"

#ifndef MATH
#define MATH
#include "math.h"
#endif

#define MAX_NUM_DOUBLE_DIGITS 7
#define MIN_DIGIT 1.e-11

Okryglenie::Okryglenie()
{
}

Okryglenie::~Okryglenie()
{
}

void Okryglenie::Okryglit(
    double& DblNum,    // Число, которое необходимо округлить
    int        NumDigits    // Количество знаков после запятой, цифры после которых необходимо округлить
    )
{
    try
    {
        // Если округляемое число меньше заданного количества знаков после запятой, возвращаем 0.0
        if(fabs(DblNum) < MIN_DIGIT)
        {
            DblNum=0.0f;
            throw exExit();
        }

        // Если задали количество знаков бОльшее предельно допустимого, возвращаем double без изменений
        if(NumDigits > MAX_NUM_DOUBLE_DIGITS)
            throw exExit();
        //return DblNum;

        int Order = 0;    // Порядок десятичного числа
        double Quotient, DblNumE6;
        long int NearestInt64; // Эту строку в 7-м вижуал си поменять на "INT64 NearestInt64"

        Quotient = DblNum;

        // Если число находится в пределах от 0.1 до 1.0 или равно 0.1 или 1.0, тогда это число
        // нулевого порядка. Order остается равным нулю.
        if(fabs(DblNum) < 0.1)
        {
            Quotient *= 10.;
            Order--;
            while(fabs(Quotient) < 0.1)
            {
                Quotient *= 10.;
                Order--;
            }
        }
        else if(fabs(DblNum) > 1.)
        {
            Quotient /= 10.;
            Order++;
            while(fabs(Quotient) > 1.)
            {
                Quotient /= 10.;
                Order++;
            }
        }

        DblNumE6 = Quotient * pow(10., (double)NumDigits);   // Quotient * (10.**NumDigids)

        int Sign = 1;
        if(DblNum < 0.0)
            Sign = -1;

        NearestInt64 = (long int)(DblNumE6 + Sign * 0.5); // В 7-м вижуал си поменять эту строку
        // на "NearestInt64 = (INT64)(DblNumE6 + Sign * 0.5);"

        Quotient = NearestInt64 / pow(10., (double)NumDigits); // NearestInt / (10.**NumDigids)

        DblNum = Quotient;

        if( Order <= -1*NumDigits )
        {
            DblNum = 0.0f;
            throw exExit();
            //return DblRound;
        }

        if( Order > 0 )
        {
            while(Order > 0)
            {
                Quotient = Quotient * 10.;
                Order--;
            }
            DblNum = Quotient;
        }
        else if( Order < 0 )
        {
            while(Order < 0)
            {
                Quotient = Quotient / 10.;
                Order++;
            }
            DblNum = Quotient;
        }
    }

    catch (Okryglenie::exExit)
    {
    }
    //return DblRound;
}

 

Ваше сообщение
Имя*:
EMail:
Для отправки новых сообщений в текущей нити на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру