
Еще можно вот так, но так будет больше ресурсов процессора потребляться, по-моему:
Sign *= -1; //это пишется в цикле while() сразу после расчета члена ряда
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
Переменные должны быть ортогональны друг другу. Счетчик цикла и индикатор четности не ортогональны. При этом вы предлагаете их считать отдельно друг от друга.Слива писал(а):Не понял Ваш комментарий, если честно. Вы уж извините, но по-моему он бессмысленный.
Ну да, первый признак пионерского кода - по одной переменной на каждый чих.Слива писал(а): Тот способ который показал я уже используется давно и в частности использовался мной лично.
У всех компиляторов есть возможность генерации ассемблерных листингов вдобавок к *.obj/*.exe. Если у вас есть идея о том во что превращается код на С++, то при желании это можно легко проверить.Слива писал(а): Еще можно вот так, но так будет больше ресурсов процессора потребляться, по-моему:
Слива писал(а):В чем код-то пионерский? По 1 варианту процессор будет каждый раз делить и напрягаться - не рационально.
Спасибо Вам большое за помощь! Во всем разобрался и написал в тот день программу (код ниже, если интересно хоть чуть-чуть).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");
}
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); }
Код: Выделить всё
int n = 0; // <- Это важно
double next;
do {
n++;
next = ((n % 2) * 2 - 1)*((pow((a - 1), n)) / n);
ln += next;
} while (abs(next) > 0.000001);
- кстати, да, просто там будет сдвиг на 2 вправо(не гарантия, но большая вероятность) и тот бит, который выдвинуля и будет результат. Ресурсов проца мало, да. Но DIV никто не использует: ни я, ни автор.Absurd писал(а):Там деление происходит на константу, причем на хорошую константу. Смысла использовать DIV нет никакого, можно использовать SHR.
Слива писал(а):- кстати, да, просто там будет сдвиг на 2 вправо(не гарантия, но большая вероятность) и тот бит, который выдвинуля и будет результат. Ресурсов проца мало, да. Но DIV никто не использует: ни я, ни автор.
Код: Выделить всё
; 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;