diff options
author | Amaury Pouly <pamaury@rockbox.org> | 2010-02-02 20:49:35 +0000 |
---|---|---|
committer | Amaury Pouly <pamaury@rockbox.org> | 2010-02-02 20:49:35 +0000 |
commit | 75fc9ee84b73287bdca627f414bc91c964b238d8 (patch) | |
tree | 5761f3a0a2373c7f1c283092074ec19ad18af275 /apps | |
parent | a54cacb508b7904d1923135a2d27e31d3f5a4b41 (diff) | |
download | rockbox-75fc9ee84b73287bdca627f414bc91c964b238d8.tar.gz rockbox-75fc9ee84b73287bdca627f414bc91c964b238d8.zip |
FS#8967: Fix autoscore computation overflow when the playtime is huge.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@24471 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps')
-rw-r--r-- | apps/tagcache.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/apps/tagcache.c b/apps/tagcache.c index 79c96ff186..9ffb6f86fe 100644 --- a/apps/tagcache.c +++ b/apps/tagcache.c | |||
@@ -772,9 +772,19 @@ static long check_virtual_tags(int tag, const struct index_entry *idx) | |||
772 | } | 772 | } |
773 | else | 773 | else |
774 | { | 774 | { |
775 | data = 100 * idx->tag_seek[tag_playtime] | 775 | /* A straight calculus gives: |
776 | / idx->tag_seek[tag_length] | 776 | autoscore = 100 * playtime / length / playcout (1) |
777 | / idx->tag_seek[tag_playcount]; | 777 | Now, consider the euclidian division of playtime by length: |
778 | playtime = alpha * length + beta | ||
779 | With: | ||
780 | 0 <= beta < length | ||
781 | Now, (1) becomes: | ||
782 | autoscore = 100 * (alpha / playcout + beta / length / playcount) | ||
783 | Both terms should be small enough to avoid any overflow | ||
784 | */ | ||
785 | data = 100 * (idx->tag_seek[tag_playtime] / idx->tag_seek[tag_length]) | ||
786 | + (100 * (idx->tag_seek[tag_playtime] % idx->tag_seek[tag_length])) / idx->tag_seek[tag_length]; | ||
787 | data /= idx->tag_seek[tag_playcount]; | ||
778 | } | 788 | } |
779 | break; | 789 | break; |
780 | 790 | ||