Разница между int и double в C ++ Visual Studio - PullRequest
0 голосов
/ 22 декабря 2011

Я делаю простую программу, которая абстрагирует комплексные числа и операции с комплексными числами. Я начал с целочисленных типов данных для моих мнимых и реальных аспектов моих комплексных чисел из-за моего огромного невежества, когда после сложения, вычитания и умножения кода я понял, что для деления мне нужно будет использовать удвоения. Когда я переключился на удвоения, я получил плохие результаты из моих предыдущих трех расчетов, которые прекрасно работали, когда значения хранились как целые. Может кто-нибудь объяснить мне, что же такого принципиально отличного от 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)

1 Ответ

3 голосов
/ 22 декабря 2011

Что должен знать каждый программист C / C ++ о printf спецификаторах формата: %d для int, %f для double.

...