mserg писал(а):
...полная чушь. Но, не суть.
#include <stdio.h>
#include <float.h>
__int64 mask[53];
void initmask()
{
mask[52] = 0;
mask[51] = 1;
for (int i = 51; i--; i>0)
mask[i] = 2*mask[i+1];
for (int i = 52; i--; i>0)
mask[i] += mask[i+1];
}
double succval (double x)
{
volatile double r;
_controlfp( _RC_UP, _MCW_RC );
r = x + DBL_EPSILON;
_controlfp( _RC_NEAR, _MCW_RC );
return r;
}
double round2down(double x, int p)
{
p--;
__int64* x_ = (__int64*)&x;
volatile double y;
__int64* y_ = (__int64*)&y;
if (x >= 0)
*y_ = *x_ & ~mask[p];
else
if (*x_ & mask[p])
{
*y_ = *x_ | mask[p];
y = succval(y);
}
else y = x;
return y;
}
double round2up(double x, int p)
{
return -round2down(-x,p);
}
int main()
{
initmask();
double x = 2*7/3.0;
int p = 1;
printf("x=%f, p=%d, down(x)=%f, up(x)=%f\n", x, p, round2down(x,p), round2up(x,p));
return 0;
}
Есть тут какой-нибудь изъян?
Код:
void initmask()
{
mask[52] = 0;
mask[51] = 1;
for (int i = 51; i--; i>0)
mask[i] = 2*mask[i+1];
постольку поскольку в 52-й ячейке массива 0, то весь массив будет заполен 0, кроме нулевой ячейки
Код:
for (int i = 52; i--; i>0)
mask[i] += mask[i+1];
берем то, что лежит за пределами массива и заполняем этим тот же массив????? опять таки кроме нулевой ячейки, что, впрочем сильно не отличается от того что в других ячейках
Код:
}
Я в генетическом программировании не понимаю, но какой великий смысл этой функции?
Далее
Код:
double round2down(double x, int p)
{
p--;
__int64* x_ = (__int64*)&x;
volatile double y;
__int64* y_ = (__int64*)&y;
if (x >= 0)
если указателю присвоен некий адрес, то указатель всегда будет больше нуля
Код:
*y_ = *x_ & ~mask[p];
в ячейке mask[0] лежит полная чушь,
и в далее мы вообще никогда не попадем.
Код:
else
if (*x_ & mask[p])
{
*y_ = *x_ | mask[p];
y = succval(y);
}
else y = x;
return y;}
получим полную чушь с typesize = 64 бита
Это называется генетическим программированием???? Что-то я отстал от всех этих новшеств.