4

私はこのコードで奇妙な問題に遭遇しました:

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

これは、特定のテキストファイルの読みやすさの指標の計算です。これは宿題なので、インデックスはどうあるべきか(80、つまり正確に80.3)と言われました。

私の音節数、単語数、文数はすべて正しいです(これらはサンプルテキストファイルの指定された数と一致します。

数字をハードコーディングしても、正確に見たとおりに計算機に入れた場合でも、80は得られません。何が悪いのか想像できません。

これが私たちに与えられた方程式です:

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

ご覧のとおり、変数(正しい値を保持しています。参考までに、インストラクターから与えられた55音節、40単語、4文)をプラグインしました。実行時にプログラムが生成する値は、 112の読みやすさ指数。

角かっこが足りないのですか、それとも何ですか?困った!

4

8 に答える 8

9

名前(単語を含む)からすぐに、、は整数として宣言され ているcountSylbと思います。したがって、除算は整数演算を実行し、小数点以下の部分を切り捨てています。それらをフロートにキャストすると、修正されるはずです。countSentcountWord

legibIndex = 206.385 - 84.6 * ((float)countSylb / ((float)countWord) - 
               1.015 * (((float)countWord / ((float)countSent);
于 2010-02-08T15:28:06.117 に答える
2

floatではなくint/int = intであるため、丸めているデータ型の問題が発生している可能性があります。

フロートにキャストするか、フロートとして宣言する場合、それはあなたを助けるはずです。

于 2010-02-08T15:30:31.843 に答える
1

ここで動作します。おそらく、float除算の代わりに整数除算を行っています。

>>> 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
于 2010-02-08T15:27:51.233 に答える
1

括弧内の計算が純粋な整数である場合、計算は小数部分を削除して切り捨てられ ( floor() を使用するのと同じ)、明らかに結果が変わります。

于 2010-02-08T15:50:38.683 に答える
0

これはおそらく演算子の優先順位の問題です。確かに、あなたがすでに持っているよりも最初に起こるべきだと思うことをグループ化してください。

編集いいえ、そうではありません。Cの演算子の優先順位を使用すると、80.36が得られます。スパークはデータ型の問題であり、時期尚早の丸めに直面しているということは正しかった(そして最初のマークから外れた)と思います。

于 2010-02-08T15:27:03.420 に答える
0

Haskellでこれを実行すると、正しい答え(80.36000000000001)が得られます。

于 2010-02-08T15:27:33.107 に答える
0

問題は、整数演算を使用している場合、(#音節/#単語)が1になることだと思います。浮動小数点演算を使用して計算を実行することを確認すると(つまり、#音節/#単語= 1.375)、正しい答えが得られるはずです。

于 2010-02-08T15:30:29.550 に答える
0

上で指摘したように、カウント変数はおそらく整数整数ですが、式にはリテラル浮動小数点数が含まれています。これらの int を float にキャストすると、正しい値が得られます。また、式の結果を (legibIndex) に格納するものも float 型であることを確認する必要があります。

于 2010-02-08T16:48:20.743 に答える