为什么C给我一个不同于我的计算器的答案?

时间:2010-02-08 15:24:05

标签: c floating-point division

我遇到了这个代码的奇怪问题:

legibIndex = 206.385 - 84.6 * (countSylb / countWord) - 1.015 * (countWord / countSent);

这是给定文本文件的易读性索引的计算。 由于这是一项家庭作业,我们被告知索引应该是什么(80,或者恰好是80.3)

我的音节数,字数和句子数都是正确的(它们与示例文本文件的给定数字相匹配。

即使我对这些数字进行硬编码,我也不会得到80,即使我把它放入我的caclulator中也是如此。我无法想象有什么问题。

以下是我们给出的等式:

Index = 206.835 - 84.6 * (# syllables/# words) - 1.015 * (# words/# sentences)

正如您所看到的,我只是插入了我的变量(它们保存了正确的值)。 作为参考,值为:55个音节,40个单词,4个句子,由教师给出。我的程序在运行时产生的值是易读性指数112.

我错过了一些括号,或者是什么? 我很难过!

8 个答案:

答案 0 :(得分:9)

立即从名称(包括 count 这个词)开始,我猜是countSylbcountSentcountWord被声明为整数,因此你的分区正在进行整数运算,截断小数部分。把它们扔到花车上,应该修好它。

legibIndex = 206.385 - 84.6 * ((float)countSylb / ((float)countWord) - 
               1.015 * (((float)countWord / ((float)countSent);

答案 1 :(得分:2)

你可能有一个数据类型问题,你正在进行舍入,因为int / int = int而不是float。

如果你强制转换为float或声明为float,它应该对你有帮助。

答案 2 :(得分:1)

在这里工作。也许你正在进行整数除法而不是浮动除法:

>>> def leg(syl, wor, sen):
...   return 206.835 - 84.6 * (float(syl) / wor) - 1.015 * (float(wor) / sen)
... 
>>> print leg(55, 40, 4)
80.36

答案 3 :(得分:1)

如果括号内的计算是纯整数,则计算将删除小数部分并向下舍入(与使用floor()相同),这显然会改变结果。

答案 4 :(得分:0)

这可能是一个operator precedence问题。可以肯定的是,将您认为应该首先发生的事情分组比现有的更多。

修改不,不是;使用C的运算符优先级得到80.36。我希望 sparks 是正确的(并且第一个没有标记),这是一个数据类型问题而且你正在经历过早的舍入。

答案 5 :(得分:0)

当我在Haskell中运行时,我得到了正确答案(80.36000000000001)。

答案 6 :(得分:0)

我认为如果您使用整数运算,问题是(#syllables / #words)变为1。如果你确保使用浮点运算执行计算(所以#syllables / #words = 1.375),你应该得到正确的答案。

答案 7 :(得分:0)

如上所述,您的计数变量可能是整数整数,但您的表达式包含文字浮点数。将这些整体铸造成浮标会给出正确的价值。您还必须确保存储表达式结果(legibIndex)的内容也是float类型。