Я делаю простую программу, которая абстрагирует комплексные числа и операции с комплексными числами. Я начал с целочисленных типов данных для моих мнимых и реальных аспектов моих комплексных чисел из-за моего огромного невежества, когда после сложения, вычитания и умножения кода я понял, что для деления мне нужно будет использовать удвоения. Когда я переключился на удвоения, я получил плохие результаты из моих предыдущих трех расчетов, которые прекрасно работали, когда значения хранились как целые. Может кто-нибудь объяснить мне, что же такого принципиально отличного от int и double в c ++, что делает мой код хорошо работающим для int, но умирает, когда я пытаюсь использовать double?
Я вставил свой код для справки.
#include "Complex.h"
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
Complex::Complex(){
real = 0;
imaginary = 0;
}
Complex::Complex(double givenReal, double givenImaginary)
{
real = givenReal;
imaginary = givenImaginary;
}
double Complex::getImaginary(){
return imaginary;
}
double Complex::getReal(){
return real;
}
double Complex::getMagnitude(){
//magnitude = sqrt(pow(real,2)+pow(magnitude,2));
return magnitude;
}
Complex Complex::operator+(Complex n){
Complex j = Complex();
j.real = real + n.real;
j.imaginary = imaginary + n.imaginary;
return j;
}
Complex Complex::operator-(Complex n){
Complex j = Complex();
j.real = real - n.real;
j.imaginary = imaginary - n.imaginary;
return j;
}
Complex Complex::operator*(Complex n){
Complex j = Complex();
j.real = (real * n.real)-(imaginary * n.imaginary);
j.imaginary = (real * n.imaginary) + (imaginary * n.real);
return j;
}
Complex Complex::operator/(Complex n){
Complex j = Complex();
j.real = ((real * n.real) + (imaginary * n.imaginary))/(n.real*n.real + n.imaginary*n.imaginary);
j.imaginary = ((imaginary*n.real)-(real * n.imaginary))/(n.real*n.real + n.imaginary*n.imaginary);
return j;
}
int main(){
Complex a = Complex(1, 3);
Complex b = Complex(4, 8);
Complex c = a+b;
printf("Adding a and b\nExpected: (5,11)\nActual: (%d,%d)\n",c.getReal(), c.getImaginary());
c = a-b;
printf("Subtracting b from a\nExpected: (-3,-5)\nActual: (%d,%d)\n",c.getReal(), c.getImaginary());
c = a*b;
printf("Multiplying a and b\nExpected: (-20,20)\nActual: (%d,%d)\n",c.getReal(), c.getImaginary());
c = a/b;
printf("Dividing a by b\nExpected: (.35,.05)\nActual: (%d,%d)\n",c.getReal(), c.getImaginary());
system ("pause");
}
Выход:
Добавление а и б
Ожидаемое: (5,11)
Фактически: (0,1075052544)
Вычитание b из
Ожидаемый: (-3, -5)
Фактический: (0, -1073217536)
Умножение а и б
Ожидаемый: (-20,20)
Фактический: (0, -1070333952)
Деление на b
Ожидаемый: (.35, .05)
Фактический: (1610612736,1071015526)