整数除法?

问题描述

关于下面显示代码

#include <cmath>

int main()
{
    const int n = 10000;
    const int K = 10;
    double* matrix = new double[n * n];

    for(int k = 0; k < K; ++k) {
        for(int j = 0; j < n; ++j) {
            for(int i = 0; i < n; ++i) {
        double ai = (double)i/double(n);
        double aj = (double)i/double(n);
                matrix[i * n + j] += pow(n,(double)k / K) / exp((double)k / K) * pow(sin(ai),2) * pow(sin(aj),2);
            }
        }
    }
}

是那种线条

double ai = (double)i/double(n);
double aj = (double)i/double(n);

被定义是因为我们想要浮点除法而不是整数除法?

此外,为什么操作数按它们的方式进行转换,即 (double)i/double(n) 而不是 double(i)/double(n)?

解决方法

是的。实际上,只转换一个操作数就足够了,但一些程序员更喜欢转换所有操作数以保持一致性和更清晰。

,

是的,因为如果 i 和 n 是两个整数,如下所示:

int i = ...; 
int n = ...;
double ai = i/n 

这将是一个整数除法。假设 i=5 和 n=9,即使 ai 是双精度数,结果也会是 0。

您可以强制转换 i 或 n 来告诉编译器您想要一个浮点除法。