C中int类型的sqrt()

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C中int类型的sqrt()相关的知识,希望对你有一定的参考价值。

我在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 - 它如何工作?

谢谢

答案

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

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

另一答案

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

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

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

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

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

另一答案

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

另一答案

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

int start = Data -> start_number;
int localSum;

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

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

以上是关于C中int类型的sqrt()的主要内容,如果未能解决你的问题,请参考以下文章

C# - Math.Sqrt() 返回小数

对这个带有 & 不带 = 的代码片段返回类型感到非常困惑

断言失败:在 .js 文件 (emscripten) 中调用 c 函数时,在运行时初始化错误之前调用了本机函数 `int_sqrt`

从Haskell的Int获取sqrt

C ++ 11 int8_t buggy输入/输出

解释'空'C数组(int a = {};)