Не понял Ваш комментарий, если честно. Вы уж извините, но по-моему он бессмысленный. Тот способ который показал я уже используется давно и в частности использовался мной лично. Вынести расчет ряда в функцию и никаких переменных там больше городить не надо.
Еще можно вот так, но так будет больше ресурсов процессора потребляться, по-моему:
Sign *= -1; //это пишется в цикле while() сразу после расчета члена ряда
Рассчитать значение функции с использованием циклов while или do while
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
-
- Сообщения: 1213
- Зарегистрирован: 26 фев 2004, 13:24
- Откуда: Pietari, Venäjä
- Контактная информация:
Переменные должны быть ортогональны друг другу. Счетчик цикла и индикатор четности не ортогональны. При этом вы предлагаете их считать отдельно друг от друга.Слива писал(а):Не понял Ваш комментарий, если честно. Вы уж извините, но по-моему он бессмысленный.
Ну да, первый признак пионерского кода - по одной переменной на каждый чих.Слива писал(а): Тот способ который показал я уже используется давно и в частности использовался мной лично.
У всех компиляторов есть возможность генерации ассемблерных листингов вдобавок к *.obj/*.exe. Если у вас есть идея о том во что превращается код на С++, то при желании это можно легко проверить.Слива писал(а): Еще можно вот так, но так будет больше ресурсов процессора потребляться, по-моему:
BTW, я что-то не подумал o pow(-1., n), так будет строго по математическому определению.
2B OR NOT(2B) = FF
В принципе, Вы правы, но какая разница как их считать. В обоих случаях целостность данных сохранится. Т.е. в первом случае, как у автора:
((n%2)*2 - 1) //Тут будет целостность данных и все будет правильно
В моем случае:
Sign = -Sign;
Sign *= -1; //Тут тоже будет целостность данных и все будет правильно
Знаки чередуются, никакого индикатора четности не надо - они чередуются, как я уже сказал - это стабильный и четкий процесс, не нужно бочку катить на это - там все такое в компьютере.
Без глюков, правда, никуда. Но это уже отдельная тема для разговора. Здесь же все будет работать стабильно и хорошо.
"Ну да, первый признак пионерского кода - по одной переменной на каждый чих." - на cyberforum.ru сходите, это оттуда я взял эту идею, не такие уж они и тупые люди. Придется расколоться.
В чем код-то пионерский? По 1 варианту процессор будет каждый раз делить и напрягаться - не рационально. Вот этот код как раз и есть пионерский. А мой код лучше - он как бы оптимизирован.
Просто делаешь число отрицательным и все. Ничего считать вообще не надо. Понятно?
"BTW, я что-то не подумал o pow(-1., n), так будет строго по математическому определению." - а это еще зачем? "-" можно вынести легко и делается это по школьным правилам математики. Строго это или не строго - пофиг на это.
Я уже, если честно, устал от Ваших комментариев по этой теме. Какая разница как считать минус или плюс там получается в общем члене. В любом случае процессоры сейчас мощные и они легко все почситают. Я предпочитаю свой способ вычисления минуса, каждый предпочитает свой. Я думаю не нужно этому вопросу уделять столько внимания, он(автор) как хочет так и сделает.
Тем более для учебных целей там вообще не обсуждается насколько загружен процессор. Это только у профессионалов обсуждается - высоком уровне и не для учебных целей, а для военных и других ресурсоемких приложений(графика, например).
((n%2)*2 - 1) //Тут будет целостность данных и все будет правильно
В моем случае:
Sign = -Sign;
Sign *= -1; //Тут тоже будет целостность данных и все будет правильно
Знаки чередуются, никакого индикатора четности не надо - они чередуются, как я уже сказал - это стабильный и четкий процесс, не нужно бочку катить на это - там все такое в компьютере.
Без глюков, правда, никуда. Но это уже отдельная тема для разговора. Здесь же все будет работать стабильно и хорошо.
"Ну да, первый признак пионерского кода - по одной переменной на каждый чих." - на cyberforum.ru сходите, это оттуда я взял эту идею, не такие уж они и тупые люди. Придется расколоться.
В чем код-то пионерский? По 1 варианту процессор будет каждый раз делить и напрягаться - не рационально. Вот этот код как раз и есть пионерский. А мой код лучше - он как бы оптимизирован.
Просто делаешь число отрицательным и все. Ничего считать вообще не надо. Понятно?
"BTW, я что-то не подумал o pow(-1., n), так будет строго по математическому определению." - а это еще зачем? "-" можно вынести легко и делается это по школьным правилам математики. Строго это или не строго - пофиг на это.
Я уже, если честно, устал от Ваших комментариев по этой теме. Какая разница как считать минус или плюс там получается в общем члене. В любом случае процессоры сейчас мощные и они легко все почситают. Я предпочитаю свой способ вычисления минуса, каждый предпочитает свой. Я думаю не нужно этому вопросу уделять столько внимания, он(автор) как хочет так и сделает.
Тем более для учебных целей там вообще не обсуждается насколько загружен процессор. Это только у профессионалов обсуждается - высоком уровне и не для учебных целей, а для военных и других ресурсоемких приложений(графика, например).
-
- Сообщения: 1213
- Зарегистрирован: 26 фев 2004, 13:24
- Откуда: Pietari, Venäjä
- Контактная информация:
Слива писал(а):В чем код-то пионерский? По 1 варианту процессор будет каждый раз делить и напрягаться - не рационально.
Там деление происходит на константу, причем на хорошую константу. Смысла использовать DIV нет никакого, можно использовать SHR.
2B OR NOT(2B) = FF
-
- Сообщения: 5
- Зарегистрирован: 16 окт 2017, 01:05
Спасибо Вам большое за помощь! Во всем разобрался и написал в тот день программу (код ниже, если интересно хоть чуть-чуть).Absurd писал(а):Там деление происходит на константу, причем на хорошую константу. Смысла использовать DIV нет никакого, можно использовать SHR.
Код: Выделить всё
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
setlocale(LC_ALL, "Russian");
int n = 1;
double ln = 0;
double a;
cout << "Введите число a в промежутке от 0 до 2 :" << endl;
cin >> a;
double next = ((n % 2) * 2 - 1)*((pow((a - 1), n)) / n);
b
if (a >= 0 && a <= 2) {
while (abs(next) > 0.000001)
{
n++;
ln += next;
next = ((n % 2) * 2 - 1)*((pow((a - 1), n)) / n);
}
printf("Ln:\n%.6f\n", ln);
}
esle {
cout << "Введенное число больше 2 или меньше 0"
}
system("pause");
}
-
- Сообщения: 1213
- Зарегистрирован: 26 фев 2004, 13:24
- Откуда: Pietari, Venäjä
- Контактная информация:
alexboliam писал(а):Спасибо Вам большое за помощь! Во всем разобрался и написал в тот день программу (код ниже, если интересно хоть чуть-чуть).Код: Выделить всё
double next = ((n % 2) * 2 - 1)*((pow((a - 1), n)) / n); ... while (abs(next) > 0.000001) { ... n++; ln += next; next = ((n % 2) * 2 - 1)*((pow((a - 1), n)) / n); }
Есть программистское правило - Do not repeat yourself. По русски - "нельзя повторять один и тот же код".
Я так понимаю, в твоем коде расчет next дублирован чтобы while выполнился в первый раз. Но если нужно выполнить цикл как минимум один раз с проверкой в конце, то тут do...while более очевиден.
Код: Выделить всё
int n = 0; // <- Это важно
double next;
do {
n++;
next = ((n % 2) * 2 - 1)*((pow((a - 1), n)) / n);
ln += next;
} while (abs(next) > 0.000001);
2B OR NOT(2B) = FF
- кстати, да, просто там будет сдвиг на 2 вправо(не гарантия, но большая вероятность) и тот бит, который выдвинуля и будет результат. Ресурсов проца мало, да. Но DIV никто не использует: ни я, ни автор.Absurd писал(а):Там деление происходит на константу, причем на хорошую константу. Смысла использовать DIV нет никакого, можно использовать SHR.
Цитата кода:
while(abs(next) > 0.000001)
Неправильно пишете. 2 за кодинг. Я же показал, как надо писать:
while(fabs(next) > 1E-6)
-
- Сообщения: 1213
- Зарегистрирован: 26 фев 2004, 13:24
- Откуда: Pietari, Venäjä
- Контактная информация:
Слива писал(а):- кстати, да, просто там будет сдвиг на 2 вправо(не гарантия, но большая вероятность) и тот бит, который выдвинуля и будет результат. Ресурсов проца мало, да. Но DIV никто не использует: ни я, ни автор.
Опять 25. Зачем теоретизироывать, когда можно проверить?
Код: Выделить всё
; 24 : next = ((n % 2) * 2 - 1)*((pow((a - 1), n)) / n);
mov eax, ebx
and eax, -2147483647 ; ffffffff80000001H
jge SHORT $LN18@main
dec eax
or eax, -2
inc eax
$LN18@main:
movd xmm2, ebx
lea eax, DWORD PTR [rax*2-1]
cvtdq2pd xmm2, xmm2
movd xmm3, eax
divsd xmm0, xmm2
cvtdq2pd xmm3, xmm3
mulsd xmm3, xmm0
; 25 : ln += next;
2B OR NOT(2B) = FF
- Romeo
- Сообщения: 3091
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Он просто не умеет просматривать дизассемблинг
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Умею, просто мне лень. Мне опять лень разбирать этот код. Там что, операция "divsd xmm0, xmm2" - это и есть n%2?