Visual c++ C+中int和double之间的差异+;Visual Studio

Visual c++ C+中int和double之间的差异+;Visual Studio,visual-c++,double,int,Visual C++,Double,Int,我正在做一个简单的程序,抽象复数和复数运算。我开始用整数数据类型来表示复数的虚数和实数,因为我对加法、减法和乘法编码成功后,我意识到除法需要使用双精度。当我切换到double时,我从之前的三次计算中得到了糟糕的结果,当值存储为int时,这三次计算非常有效。有人能解释一下,C++中的INTs和加法器有什么根本不同,这使得我的代码在INT上工作得很好,但是当我尝试使用双倍时,它就死了? 我粘贴了代码以供参考 #include "Complex.h" #include <math.h>

我正在做一个简单的程序,抽象复数和复数运算。我开始用整数数据类型来表示复数的虚数和实数,因为我对加法、减法和乘法编码成功后,我意识到除法需要使用双精度。当我切换到double时,我从之前的三次计算中得到了糟糕的结果,当值存储为int时,这三次计算非常有效。有人能解释一下,C++中的INTs和加法器有什么根本不同,这使得我的代码在INT上工作得很好,但是当我尝试使用双倍时,它就死了? 我粘贴了代码以供参考

 #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");
}
#包括“Complex.h”
#包括
#包括
#包括
Complex::Complex(){
实数=0;
虚数=0;
}
Complex::Complex(双给定值、双给定值)
{
真实=真实;
想象的=给定的想象;
}
双复数::getImaginate(){
回归想象;
}
双复数::getReal(){
回归真实;
}
双复数::getMagnitude(){
//震级=sqrt(功率(实数,2)+功率(震级,2));
返回量;
}
复数::运算符+(复数n){
复数j=复数();
j、 real=real+n.real;
j、 假想的=假想的+n.假想的;
返回j;
}
复数:运算符-(复数n){
复数j=复数();
j、 real=real-n.real;
j、 假想的=假想的-n.假想的;
返回j;
}
复数:运算符*(复数n){
复数j=复数();
j、 实=(实*n.real)-(虚*n.virtual);
j、 虚的=(实的*n.虚的)+(虚的*n.实的);
返回j;
}
复数:运算符/(复数n){
复数j=复数();
j、 实=((实*n.real)+(虚*n.virtual))/(n.real*n.real+n.virtual*n.virtual);
j、 虚的=((虚的*n.real)-(实的*n.virtual))/(n.real*n.real+n.virtual*n.virtual);
返回j;
}
int main(){
复合物a=复合物(1,3);
复合物b=复合物(4,8);
络合物c=a+b;
printf(“添加a和b\n预期:(5,11)\n实际:(%d,%d)\n”,c.getReal(),c.getvirtual());
c=a-b;
printf(“从a中减去b的期望值:(-3,-5)\n实际值:(%d,%d)\n”,c.getReal(),c.getvirtual());
c=a*b;
printf(“将a和b相乘\n预期:(-20,20)\n实际:(%d,%d)\n”,c.getReal(),c.getvirtual());
c=a/b;
printf(“a除以b\n预期:(.35.05)\n实际:(%d,%d)\n”,c.getReal(),c.getvirtual());
系统(“暂停”);
}
输出:
添加a和b
预期:(5,11)
实际:(01075052544)
从a中减去b
期望值:(-3,-5)
实际值:(0,-1073217536)
将a和b相乘
期望值:(-20,20)
实际:(0,-1070333952)
a除以b
预期:(.35.05)

实际:(16106127361071015526)
每个C/C++程序员都应该知道的
printf
格式说明符是:
%d
表示
int
%f
代表
double

每一个C/C++程序员都应该知道的
printf
格式说明符是:
%d
代表
int
%f
代表
double

值并不是四舍五入错误,在我看来,我得到了地址空间之类的结果。我将把我的输出放在我的原始问题中。这并不是值被舍入错误,而是我得到的结果看起来像是地址空间或其他东西。我将把我的输出放在我的原始问题中。我倾向于指出,在函数(如
printf
scanf
中)中不使用适当的格式说明符会导致未定义的行为&确保为此类函数指定适当的类型始终是用户的责任。我倾向于指出,不使用适当的格式说明符在诸如
printf
scanf
之类的函数中,会导致未定义的行为&用户始终有责任确保为此类函数指定适当的类型。