Заблокирован Статус: Не в сети Регистрация: 26.07.2006
Daemon писал(а):
У тебя есть указатель на Base, приводишь его к типу Derv1, т.е. мы спускаемся по иерархии наследования. Но учти, что оба класса должны быть полиморфными, а у тебя не так, у тебя деструктор в обоих классах не виртуальный.
Насколько я понимаю я привожу указатель на Base не к типу Derv1 а к указателю на тип Derv1. А вот с термином "полиморфизм" я ещё к своему стыду не разобрался:) Так что ничего по этому поводу сказать не могу, зазве что то - что прога работает хАрАшо. Я её из книги взял.
char *my_gcvt( double value, int digits, char *buffer ) { if ( digits < 1 ) digits = 1; if ( digits > 17 ) digits = 17;
char *cur_pos = buffer; // указатель на текущее место в выходном буфере
// для отрицательных чисел нужно вывести знак if ( value < 0 ) { *cur_pos++ = '-'; value = -value; }
// нормализуем число и считаем десятичную степень (экспоненту) int exponent = 0; while ( value >= 1.0 ) value /= 10.0, ++exponent; while ( value < 1.0 ) value *= 10.0, --exponent; double eps = 5 * pow( 10.0, -digits ); // eps - для компенсации ошибки округления value += eps; if ( value >= 10.0 ) value /= 10.0, ++exponent;
// считаем первые digits цифр числа и записываем в промежуточный буфер char buf[_CVTBUFSIZE], *buf_iter = buf; // массив с итератором for ( int i = 0; i < digits; ++i ) { *buf_iter++ = ( char ) floor( value ) + '0'; // записываем цифру в массив value = ( value - floor( value ) ) * 10; // вычисляем следующую цифру } *buf_iter = 0; // конец строки
Немного не эффективно правда. По-хорошему, надо бы ещё добавить проверку на INF и NAN и обрезать не значащие нули. Можешь заняться. З.Ы. Исправил небольшой косяк с округлением.
Заблокирован Статус: Не в сети Регистрация: 26.07.2006
Спасибо, очень интересный код!:) Но хотелось бы кое что уточнить - зачем нужны строки:
int exponent = 0;
while ( value >= 1.0 ) value /= 10.0, ++exponent;
while ( value < 1.0 ) value *= 10.0, --exponent;
и что такое _CVTBUFSIZE?
_CVTBUFSIZE - в MSDN пишут, что это максимально возможный размер результирующей строки (около 350 байт).
А строки, что ты указал, приводят число к значению x: 1 <= x < 10, число = x * 10^exponent.
Member
Статус: Не в сети Регистрация: 30.06.2005 Откуда: Питер
Билли Бонс писал(а):
GrIfFiN7 Вот, наваял
Немного не эффективно правда. По-хорошему, надо бы ещё добавить проверку на INF и NAN и обрезать не значащие нули. Можешь заняться. З.Ы. Исправил небольшой косяк с округлением.
Надо не только "добавить проверку на INF и NAN", а еще и указатель, так как, если тебе клиент передаст не указатель на буфер, а NULL, ты успешно завалишься.
Holmes Да ладно тебе придираться-то! Это ж пример просто - не хотел код раздувать на несколько экранов, вот и писал так для краткости. З.Ы. А на NULL надо проверять, согласен, хотя от кривых рук всё равно не застрахуешься.
Member
Статус: Не в сети Регистрация: 30.06.2005 Откуда: Питер
Билли Бонс писал(а):
Holmes Да ладно тебе придираться-то! Это ж пример просто - не хотел код раздувать на несколько экранов, вот и писал так для краткости. З.Ы. А на NULL надо проверять, согласен, хотя от кривых рук всё равно не застрахуешься.
Это точно. Хотя можно быть параноиком и писать параноидальный код!
Member
Статус: Не в сети Регистрация: 01.05.2006 Откуда: Питер
товарищи, глупый вопрос - как извлечь корень третьей степени на С?
_________________ В технике, модератор — это устройство для уменьшения тяги в топке паровой машины на холостом ходу, что позволяет снизить расход топлива.
Member
Статус: Не в сети Регистрация: 01.05.2006 Откуда: Питер
Aside спасибо =)
все утро млин думал так и не догадался...
_________________ В технике, модератор — это устройство для уменьшения тяги в топке паровой машины на холостом ходу, что позволяет снизить расход топлива.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения