|
|
|
Железный канал: «C, С++» |
|
|
Dimaxx 996 EGP
Рейтинг канала: 8(898) Репутация: 204 Сообщения: 5802 Откуда: Северодвинск Зарегистрирован: 26.06.2002 |
|
Я не силен в Си, поэтому прошу помочь. Как проглотить следующие фрагменты на паскаль:
1) for (i = 1; i < F; i++)
if ((cmp = key[i] - text_buf[p + i]) != 0) break;
2) if ((match_length = i) >= F) break;
3) Переменной типа int приравнивается следующее - s = (s + 1) & (N - 1); Что означает "&"? "&&" знаю, а если один. "Переводчики" переводят как "and", но это неверно.
Последний раз редактировалось: Мамонт (13:35 29-05-2015), всего редактировалось 6 раз(а) |
|
|
Rade 430 EGP
Репутация: 32 Сообщения: 2666 Откуда: Москва, Россия Зарегистрирован: 08.02.2001 |
|
Эххх... Как же там было?
Не помню, можно ли присваивать в условном операторе в паскале? Если можно, то скомбинируй, а пока так:
1) for (i = 1; i < F; i++)
if ((cmp = key[i] - text_buf[p + i]) != 0) break;
i:=1;
While i<F do
begin
cmp:=key[i] - text_buf[p + i]; // Гм, от комментариев по поводу того, что будет делать эта строка я воздержусь
If cmp <> 0 then break; // Не помню аналога для break. Здесь это просто выход выход из цикла, в исходнике из for, а здесь - из while. Goto? Как вариант i:=F;
i:=i+1;
end
2) if ((match_length = i) >= F) break;
match_length := i;
if match_length >= F break; // Опять goto? Тут break передает управление вовне цикла или switch (он же case в паскале), ты не указал опредшествующие строки...
3) & в данном случае - побитное AND.
_________________ Ужин при свечах - завтрак при огнетушителях!!! |
|
|
Star'ik 325 EGP
Рейтинг канала: 3(48) Репутация: 71 Сообщения: 1882 Откуда: Msk Зарегистрирован: 29.04.2003 |
|
Dimaxx : |
1) for (i = 1; i < F; i++)
if ((cmp = key[i] - text_buf[p + i]) != 0) break;
|
1:
For i:=1 to f do begin
cmp := key[i] - text_buf[p + i];
if cmp <> 0 then break
end;
Помоему так проще...
_________________ Все хорошее когда-нибудь кончается |
|
|
Marauder (n/a) 962 EGP
Репутация: 100 Сообщения: 9582 Откуда: Ад Зарегистрирован: 07.02.2001 |
|
ПАСКАЛЬ маЗАДАЙ!
_________________ Профиль закрыт. У пилота кончились хитпойнты. |
|
|
Dimaxx 996 EGP
Рейтинг канала: 8(898) Репутация: 204 Сообщения: 5802 Откуда: Северодвинск Зарегистрирован: 26.06.2002 |
|
2 Marauder: Ты чо, старый!! Офонарел! Сам ты маЗАДАЙ однобитный!
_________________ "Если мы не покончим с войной, война покончит с нами." Г. Г. Уэллс |
|
|
Dimaxx 996 EGP
Рейтинг канала: 8(898) Репутация: 204 Сообщения: 5802 Откуда: Северодвинск Зарегистрирован: 26.06.2002 |
|
... & в данном случае - побитное AND...
А что же тогда "&&"??
_________________ "Если мы не покончим с войной, война покончит с нами." Г. Г. Уэллс |
|
|
Rade 430 EGP
Репутация: 32 Сообщения: 2666 Откуда: Москва, Россия Зарегистрирован: 08.02.2001 |
|
&& - логическое AND (умножение). Результат: true/false
А то - побитное AND. Результат: перемножение битов операндов. Ну там маску наложить или еще что...
_________________ Ужин при свечах - завтрак при огнетушителях!!! |
|
|
Star'ik 325 EGP
Рейтинг канала: 3(48) Репутация: 71 Сообщения: 1882 Откуда: Msk Зарегистрирован: 29.04.2003 |
|
10b & 111b = 10b
111b & 101b = 101b
итд...
true && false = false
true && true = true
итд...
_________________ Все хорошее когда-нибудь кончается |
|
|
VRus 647 EGP
Рейтинг канала: 2(17) Репутация: 247 Сообщения: 5276 Откуда: Москва Зарегистрирован: 24.06.2001 |
|
Dimaxx : |
3) Переменной типа int приравнивается следующее - s = (s + 1) & (N - 1); Что означает "&"? "&&" знаю, а если один. "Переводчики" переводят как "and", но это неверно.
|
Тьфу, блин, написал наоборот, про "&&"
Ладно - написанное раньше не считается...
Пишем заново:
s:=(s+1) and (N-1);
|
|
|
Loki 791 EGP
Репутация: 162 Сообщения: 2882 Откуда: понаехали тут Зарегистрирован: 04.11.2002 |
|
Собсно имеется: некая прога которая должна вывести юзеру значения некой(дико замудренной) функции от двух переменных. Прога должна взять значение одной переменной(y) и сохраняя его постоянным просчитать значение функции изменяя вторую переменную(x) на заданном отрезке с заданным шагом. Потом взять следующий y из того же отрезка, но с двойным шагом и для него повторить все те же действия.
Собсно суть трабла:
При определенном наборе параметров(при шаге 0.1, отрезок подобран так чтобы в него входил 0) мы наблюдаем интересную картину.
Идет n-ый виток цикла, текущее значение х=-0.1, шаг стоит 0.1, следующее значение должно быть, очевидно, 0. Однако, оно вовсе не 0, а что-нибудь вроде -1.3877778e-16 Есесно дальше программа идет не по той ветке(формула по которой вычисляется функция зависит от того положительны x и y или отрицательны) и знач. функции получается тоже хз какое. Тем не менее на следующем витке, когда к -1.3877778e-16 должно прибавится 0.1 мы получаем снова нормальное значение x=0.1. Вот такая вот байда... В дебаггере видно, что проблема появляется именно при прибавлении шага(причем, чтобы проблема возникла шаг должен быть именно 0.1, при, например, 0.5 даже если функция проходит через 0 никаких проблем не возникает), т.е. перед x+=step; х был -0.1, после x+=step; стал -1.3877778e-16(или что-нибудь вроде этого)
Листинг функции:
long double func(double x,double y,double d);
void tab(double d,double y,double source,double end,double step)
{
double x=source; //source - начало отрезка, end - конец отрезка
long double f;
cout << "\ny=" <<y;
char ans='y';
for (;x<=end;)
{
f=func(x,y,d); //d - свободный член функции
cout << "\tx=" << x << "\tf=" <<f <<endl;
x+=step;
}
}
_________________ All are equal. Of course, that doesn't stop some people from being stupid fools or jerks. |
|
|
ДДМ 99 EGP
Репутация: 4 Сообщения: 104 Откуда: Земля, Россия Зарегистрирован: 16.04.2002 |
|
Хмм...
C++ это еще та .
Однажды получил при компилляции, что две строки листинга, работающие с разными переменными, не работают, пока не поменял их местами. Не помню какие именно, но что-то типа
с=a+b;
d=e-f; - не работало,
d=e-f;
c=a+b; - все ОК
По мне так это глюк компиллятора в обоих случаях.
А в твоем случае "поможет" округление до 14 знака после запятой.
Математически неправильно, но ...
P.S.: Я знаю, как это противоестественно для "сишного" программера, но попровуй еще заменить x+=step на x=x+step. Тоже где-то помогло однажды...
_________________ Мы способны дотянуться до Звёзд, не считая, что это сон... |
|
|
VRus 647 EGP
Рейтинг канала: 2(17) Репутация: 247 Сообщения: 5276 Откуда: Москва Зарегистрирован: 24.06.2001 |
|
Loki : |
Листинг функции:
long double func(double x,double y,double d);
void tab(double d,double y,double source,double end,double step)
{
double x=source; //source - начало отрезка, end - конец отрезка
long double f;
cout << "\ny=" <<y;
char ans='y';
for (;x<=end;)
{
f=func(x,y,d); //d - свободный член функции
cout << "\tx=" << x << "\tf=" <<f <<endl;
x+=step;
}
}
|
Бррр...
В-нулевых: сделай функцию func и переменные, которые она использует для вычисления результата-одного типа!!! Или double, или long double. Ктож тебе дал право так спокойненько конвертить из одного типа в другой с погрешностью в 0 ?
Если не поможет (а долно помочь ):
Во-первых, привел бы ты листинг функции func. Во-вторых, лучше бы привел полный листинг проги (ну или в приват).
Далее, уже просто по коду придирки. Зачем тебе ans?
for пишется так:
double x;
...
for (x=source; x<=and; x+=step)
{
f=func(x,y,d); //d - свободный член функции
cout << "\tx=" << x << "\tf=" <<f <<endl;
}
проще и понятней.
|
|
|
VRus 647 EGP
Рейтинг канала: 2(17) Репутация: 247 Сообщения: 5276 Откуда: Москва Зарегистрирован: 24.06.2001 |
|
ДДМ : |
C++ это еще та .
|
Нет.
Цитата: |
Однажды получил при компилляции, что две строки листинга, работающие с разными переменными, не работают, пока не поменял их местами. Не помню какие именно, но что-то типа
с=a+b;
d=e-f; - не работало,
d=e-f;
c=a+b; - все ОК
По мне так это глюк компиллятора в обоих случаях.
|
Не поверю, пока не приведешь доказательство.
Цитата: |
P.S.: Я знаю, как это противоестественно для "сишного" программера, но попровуй еще заменить x+=step на x=x+step. Тоже где-то помогло однажды...
|
Аналогично - не поверю, пока не приведешь доказательство.
|
|
|
Diff 708 EGP
Рейтинг канала: 8(861) Репутация: 44 Сообщения: 4179 Откуда: Сферическая Земля в вакууме. Зарегистрирован: 04.07.2003 |
|
2 VRus: Я и не в такое поверю. Зависит от глючности компилятора. От watcom 10.6 под QNX я как-то получил роскошное сообщение:
Cannot convert types for initialisation
Source type is "const unsigned char*"
Target type is "const unsigned char*"
Тоже никто не верил, что такое бывает...
2 Loki: Результат вычислений с плавающей точкой опасно сравнивать с константой (не только с нулем). Потому что вылезают подобные сопли. Хотя ты это уже видимо, понял.
_________________ Конец света в конце тоннеля |
|
|
ASKirilL 1220 EGP
Рейтинг канала: 3(27) Репутация: 302 Сообщения: 8209 Откуда: Москва Зарегистрирован: 21.03.2003 |
|
Для любых чисел с плавающей запятой при сравнении работает только один алгоритм..
1.посчитать разницу между числом с плавующей запятой и число с каким сравниваешь.
2.Сравнить эту разницу с малым значением(типа 0.00000001)
2.а.Если разница меньше -значит числа равны
2.б.Если нет- значит числа разные.
Больше никак числа с плавующей запятой сравнивать нельзя....
Ибо на то они и числа с плавующей запятой....
_________________ Павлов - собака. |
|
|
Pegasus 1039 EGP
Репутация: 335 Сообщения: 7085 Откуда: НН Зарегистрирован: 09.12.2002 |
|
Насчёт 0.1 и 0.5:
0.5 представляется в машинном виде точно (ибо степень двойки), 0.1 - уже с округлением.
Регулярный метод решения проблем сравнения с константами - сравнивать модуль разности с машинной точностью.
Хотя в каждом конкретном случае находится решение проще
_________________ There shall be wings! |
|
|
Loki 791 EGP
Репутация: 162 Сообщения: 2882 Откуда: понаехали тут Зарегистрирован: 04.11.2002 |
|
VRus : |
Если не поможет (а долно помочь )
|
Не помогло.
Листинг всей проги в привате в том виде в котором она была сегодня успешно сдана(про волшебное 0.1 я умолчал )
Гы. Забыл потереть когда копи-пастил
_________________ All are equal. Of course, that doesn't stop some people from being stupid fools or jerks. |
|
|
VRus 647 EGP
Рейтинг канала: 2(17) Репутация: 247 Сообщения: 5276 Откуда: Москва Зарегистрирован: 24.06.2001 |
|
Loki : |
VRus : |
Если не поможет (а долно помочь )
|
Не помогло.
Листинг всей проги в привате в том виде в котором она была сегодня успешно сдана(про волшебное 0.1 я умолчал )
|
Йоу...
Глянул листинг, но тока одним глазком - - двумя уж не получаецца - седня ж суббота.. :laugh:
О чем это я? Да, у тебя в функции - и корни, и синусы с косинусами - фсе, точно нуля, так же как и единицы - не получицца никогда, следовательно и сравнивать так нельзя.... Один из выходов Pegasus уже описал...
Да, для прикола, можешь сравнить, cos(x)*cos(x)+sin(x)*sin(x)==1 .. Вродь по математике 1 должно получиться? А в машине - фиг вам, как правило...
А насчет преобразования типов -
тож можно попробовать
double x, z;
float y;
x=1/3;
y=1/3;
(z=x-y) ? {cout << "Фигня, однако"} : {cout << "Оба-на, ноль получился " };
Фразу про ноль ты вряд ли увидишь..
|
|
|
ASKirilL 1220 EGP
Рейтинг канала: 3(27) Репутация: 302 Сообщения: 8209 Откуда: Москва Зарегистрирован: 21.03.2003 |
|
Общий смысл всего сказанного :
Cравнивать можно толлько их разницу с мелким числом...
_________________ Павлов - собака. |
|
|
Razorblade 685 EGP
Репутация: 176 Сообщения: 2316 Откуда: Воронеж Зарегистрирован: 21.12.2001 |
|
2Loki: Скинь сырцы + инфу по компилятору (производитель, версия, патчи)
_________________ "Thor God Of Thunder
Let Me Die With A Sword In My Hand" Manowar |
|
|
|
|
|
Железный канал: «C, С++» |
|