【问题标题】:Conversion to ‘int’ from ‘float’ may alter its value从“float”转换为“int”可能会改变它的值
【发布时间】:2016-02-01 10:28:10
【问题描述】:

我的代码:

#inlcude <math.h>
#include "draw.h"  /*int draw(int x, int y)*/

draw(rintf(10 * x), rintf(8 * y));

我收到此警告:从“float”转换为“int”可能会改变其值。

我无法将draw 更改为浮动,因为我需要它来绘制点。所以四舍五入是不可避免的。有任何想法吗?

【问题讨论】:

  • 显式转换为 int 可能会对您有所帮助。或者更改 rintf 可能是一个(不太好的)替代方案。
  • 取int draw(float x, float y)
  • xy的类型是什么?
  • 你为什么用rintf()而不是nearbyintf()
  • @FUZxxl 来自man nearbyintf:“如果应用程序不依赖于保留的标志,rint() 通常比nearbyint() 性能更高”。此应用程序不依赖于保留的标志。

标签: c floating-point int rounding c99


【解决方案1】:

rintf 的返回类型是float,它会产生警告。您可以显式转换为int 以抑制警告(即(int) rintf(10 * x),或者您可以使用另一种舍入方式(例如,如果已知值是非负数,则(int) (10.0f * x + 0.5f))或lrint (最好来自tgmath.h),虽然它返回一个long,这可能会导致另一个警告,具体取决于您的编译器和设置。

【讨论】:

  • (int) rintf (10 * x) 给出“警告:从‘float’类型的函数调用转换为不匹配的‘int’类型”。有些值是负数。我假设得到另一个,因为我的编译器设置非常严格。 (-std=c99 -g -Wall -Wextra -Wpedantic -Wbad-function-cast -Wconversion -Wwrite-strings -Wstrict-prototypes)
  • @user4325010 如果您在-Wall 之外启用警告,您应该准备好收到一些可以安全忽略的警告。在这种情况下,您不太可能使用任何返回浮点值的函数来抑制 bad-function-cast 警告(或者如果您可以通过一些技巧来抑制它,您可能会使代码变得更糟)......
  • @user4325010 但是,是的,即使使用-Weverything,我也可以让clang 接受(int) lrint(10 * x)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-04
  • 2012-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-23
相关资源
最近更新 更多