Форум программистов, компьютерный форум CyberForum.ru

Почему не работает функция? - C++

Восстановить пароль Регистрация
 
Dima_c8
 Аватар для Dima_c8
4 / 4 / 0
Регистрация: 17.12.2011
Сообщений: 148
05.04.2012, 11:57     Почему не работает функция? #1
Вот понадобилась функция для взятия остатка от деления нецелых чисел написал такую:
C++
1
2
3
4
5
6
long double OperationDouble( long double a , long double b )
{
     long double dop;
     dop = a - ( b * static_cast<long>( a / b ) );
     return dop;
}
Почему с целыми числами ( например 101 )работает прекрасно а с нецелыми (например 101.2)неправильно работает дайте пожалуйста верное решение
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.04.2012, 11:57     Почему не работает функция?
Посмотрите здесь:

Почему-то на работает функция!( C++
C++ функция удаления работает не корректно почему???
Почему не работает функция? C++
Почему не работает выведенная функция C++
Почему не работает функция Matricav? C++
почему не работает функция? C++
C++ Почему функция введена, но не работает?
Почему функция atanh работает неправильно? C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
05.04.2012, 12:41     Почему не работает функция? #2
Цитата Сообщение от Dima_c8 Посмотреть сообщение
Вот понадобилась функция для взятия остатка от деления нецелых чисел
Такая функция есть в стандартной библиотеке
http://www.cplusplus.com/reference/clibrary/cmath/fmod/
Цитата Сообщение от Dima_c8 Посмотреть сообщение
Почему с целыми числами ( например 101 )работает прекрасно а с нецелыми (например 101.2)неправильно работает дайте пожалуйста верное решение
Насколько я вижу, решение верное. Приведите пример, что конкретно у вас не работает.
castaway
Эксперт С++
4839 / 2978 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
05.04.2012, 14:12     Почему не работает функция? #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#include <stdio.h>
#include <stdint.h>
#include <math.h>
 
typedef union {
    double  value;
    struct {
        uint32_t    lsw;
        uint32_t    msw;
    } parts;
} ieee_double_shape_type;
 
/* Get two 32 bit ints from a double.  */
#define EXTRACT_WORDS( ix0, ix1, d )    \
    do {                                \
        ieee_double_shape_type ew_u;    \
        ew_u.value = (d);               \
        (ix0) = ew_u.parts.msw;         \
        (ix1) = ew_u.parts.lsw;         \
    } while (0)
 
/* Set a double from two 32 bit ints.  */
#define INSERT_WORDS( d, ix0, ix1 )     \
    do {                                \
        ieee_double_shape_type iw_u;    \
        iw_u.parts.msw = (ix0);         \
        iw_u.parts.lsw = (ix1);         \
        (d) = iw_u.value;               \
    } while (0)
 
static const double one = 1.0, Zero[] = {0.0, -0.0,};
 
double __ieee754_fmod( double x, double y )
{
    int32_t     n, hx, hy, hz, ix, iy, sx, i;
    uint32_t    lx, ly, lz;
 
    EXTRACT_WORDS( hx, lx, x );
    EXTRACT_WORDS( hy, ly, y );
    sx = hx & 0x80000000;       /* sign of x */
    hx ^= sx;       /* |x| */
    hy &= 0x7fffffff;   /* |y| */
 
    /* purge off exception values */
    if((hy|ly)==0||(hx>=0x7ff00000)||   /* y=0,or x not finite */
      ((hy|((ly|-ly)>>31))>0x7ff00000)) /* or y is NaN */
        return (x*y)/(x*y);
    if(hx<=hy) {
        if((hx<hy)||(lx<ly)) return x;  /* |x|<|y| return x */
        if(lx==ly)
        return Zero[(uint32_t)sx>>31];  /* |x|=|y| return x*0*/
    }
 
    /* determine ix = ilogb(x) */
    if(hx<0x00100000) { /* subnormal x */
        if(hx==0) {
        for (ix = -1043, i=lx; i>0; i<<=1) ix -=1;
        } else {
        for (ix = -1022,i=(hx<<11); i>0; i<<=1) ix -=1;
        }
    } else ix = (hx>>20)-1023;
 
    /* determine iy = ilogb(y) */
    if(hy<0x00100000) { /* subnormal y */
        if(hy==0) {
        for (iy = -1043, i=ly; i>0; i<<=1) iy -=1;
        } else {
        for (iy = -1022,i=(hy<<11); i>0; i<<=1) iy -=1;
        }
    } else iy = (hy>>20)-1023;
 
    /* set up {hx,lx}, {hy,ly} and align y to x */
    if(ix >= -1022)
        hx = 0x00100000|(0x000fffff&hx);
    else {      /* subnormal x, shift x to normal */
        n = -1022-ix;
        if(n<=31) {
            hx = (hx<<n)|(lx>>(32-n));
            lx <<= n;
        } else {
        hx = lx<<(n-32);
        lx = 0;
        }
    }
    if(iy >= -1022)
        hy = 0x00100000|(0x000fffff&hy);
    else {      /* subnormal y, shift y to normal */
        n = -1022-iy;
        if(n<=31) {
            hy = (hy<<n)|(ly>>(32-n));
            ly <<= n;
        } else {
        hy = ly<<(n-32);
        ly = 0;
        }
    }
 
    /* fix point fmod */
    n = ix - iy;
    while(n--) {
        hz=hx-hy;lz=lx-ly; if(lx<ly) hz -= 1;
        if(hz<0){hx = hx+hx+(lx>>31); lx = lx+lx;}
        else {
            if((hz|lz)==0)      /* return sign(x)*0 */
            return Zero[(uint32_t)sx>>31];
            hx = hz+hz+(lz>>31); lx = lz+lz;
        }
    }
    hz=hx-hy;lz=lx-ly; if(lx<ly) hz -= 1;
    if(hz>=0) {hx=hz;lx=lz;}
 
    /* convert back to floating value and restore the sign */
    if((hx|lx)==0)          /* return sign(x)*0 */
        return Zero[(uint32_t)sx>>31];
    while(hx<0x00100000) {      /* normalize x */
        hx = hx+hx+(lx>>31); lx = lx+lx;
        iy -= 1;
    }
    if(iy>= -1022) {    /* normalize output */
        hx = ((hx-0x00100000)|((iy+1023)<<20));
        INSERT_WORDS(x,hx|sx,lx);
    } else {        /* subnormal output */
        n = -1022 - iy;
        if(n<=20) {
        lx = (lx>>n)|((uint32_t)hx<<(32-n));
        hx >>= n;
        } else if (n<=31) {
        lx = (hx<<(32-n))|(lx>>n); hx = sx;
        } else {
        lx = hx>>(n-32); hx = sx;
        }
        INSERT_WORDS(x,hx|sx,lx);
        x *= one;       /* create necessary signal */
    }
    return x;       /* exact output */
}
 
int main()
{
    printf( "%f\n",           fmod( 10.24, 4. ) );
    printf( "%f\n", __ieee754_fmod( 10.24, 4. ) );
    return 0;
}
Yandex
Объявления
05.04.2012, 14:12     Почему не работает функция?
Ответ Создать тему
Опции темы

Текущее время: 06:41. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru