C中int类型的sqrt()

问题描述 投票:4回答:4

我在mac os x上用c语言编程。我在math.h中使用sqrt,函数如下:

int start = Data -> start_number;
double localSum;

for (start; start <= end; start++) {
    localSum += sqrt(start);
}

这有效,但为什么呢?为什么我没有得到警告?在sqrt的手册页中,它需要一个double作为参数,但我给它一个int - 它如何工作?

谢谢

c int double sqrt
4个回答
11
投票

键入不会导致精度损失的转换可能不会发出警告。它们是隐含的。

int --> double //no loss in precision (e.g 3 became 3.00)
double --> int //loss in precision (e.g. 3.01222 became 3)

触发警告的内容和不警告的内容在很大程度上取决于编译器和提供给它的标志,但是,大多数编译器(至少我使用过的编译器)都没有考虑隐式类型转换dangerous足以保证警告,因为它是语言规范中的一个特性。


警告或不警告:

C99理由表明它就像一条准则

探索这个(隐式转换)问题的一个重要结果是理解高质量的编译器可能很好地寻找这样可疑的代码并提供(可选的)诊断,并且尽责的教师可能会很好地警告程序员这些问题隐式类型转换。

C99 Rationale (Apr 2003) : Page 45


3
投票

编译器知道sqrt的原型,因此它可以 - 并且将 - 生成用于在调用函数之前将int参数转换为double的代码。

反过来也是如此,如果你将double传递给一个带有int参数的函数(使用已知原型),编译器将生成所需的转换代码。

编译器是否警告此类转换取决于编译器以及您在命令行上请求的警告级别。

对于转换int -> double,通常(具有32位(或16位)ints和IEEE754格式的64位doubles)是无损的,如果可能的话,获得对该转换的警告可能很难。

对于double -> int转换,使用gcc和clang,你需要使用-Wconversion专门请求这样的警告,否则他们将默默编译代码。


1
投票

Int可以安全地自动向上转换为double,因为没有数据丢失的风险。反之则不然。要将double变为int,您必须显式地转换它。


0
投票

C编译器使用double和int进行一些自动转换。你也可以做以下事情:

int start = Data -> start_number;
int localSum;

for (start; start <= end; start++) {
   localSum += sqrt(start);
}

即使localSum是一个int,它仍然可以工作,但它总会削减任何超出这一点的东西。 例如,如果sqrt()的返回值为1.365,则将其存储为简单1。

© www.soinside.com 2019 - 2024. All rights reserved.