mirror of
https://github.com/qbittorrent/qBittorrent.git
synced 2024-10-22 10:46:04 +03:00
Fix PieceAvailabilityBar::intToFloatVector(). Closes #3937.
This commit is contained in:
parent
522ff3b611
commit
1ecdcfc29c
1 changed files with 5 additions and 11 deletions
|
@ -70,23 +70,17 @@ std::vector<float> PieceAvailabilityBar::intToFloatVector(const std::vector<int>
|
||||||
|
|
||||||
for (int x = 0; x < reqSize; ++x) {
|
for (int x = 0; x < reqSize; ++x) {
|
||||||
|
|
||||||
// don't use previously calculated value "ratio" here!!!
|
|
||||||
// float cannot save irrational number like 7/9, if this number will be rounded up by std::ceil
|
|
||||||
// give you x2 == pieces.size(), and index out of range: pieces[x2]
|
|
||||||
// this code is safe, so keep that in mind when you try optimize more.
|
|
||||||
// tested with size = 3000000ul
|
|
||||||
|
|
||||||
// R - real
|
// R - real
|
||||||
const float fromR = (x * vecin.size()) / (float)reqSize;
|
const float fromR = x * ratio;
|
||||||
const float toR = ((x + 1) * vecin.size()) / (float)reqSize;
|
const float toR = (x + 1) * ratio;
|
||||||
|
|
||||||
// C - integer
|
// C - integer
|
||||||
int fromC = fromR;// std::floor not needed
|
int fromC = fromR;// std::floor not needed
|
||||||
int toC = std::ceil(toR);
|
int toC = std::ceil(toR);
|
||||||
|
if (toC > vecin.size())
|
||||||
|
--toC;
|
||||||
|
|
||||||
// position in pieces table
|
// position in pieces table
|
||||||
// libtorrent::bitfield::m_size is unsigned int(31 bits), so qlonglong is not needed
|
|
||||||
// tested with size = 3000000ul
|
|
||||||
int x2 = fromC;
|
int x2 = fromC;
|
||||||
|
|
||||||
// little speed up for really big pieces table, 10K+ size
|
// little speed up for really big pieces table, 10K+ size
|
||||||
|
@ -98,7 +92,7 @@ std::vector<float> PieceAvailabilityBar::intToFloatVector(const std::vector<int>
|
||||||
// case when calculated range is (15.2 >= x < 15.7)
|
// case when calculated range is (15.2 >= x < 15.7)
|
||||||
if (x2 == toCMinusOne) {
|
if (x2 == toCMinusOne) {
|
||||||
if (vecin[x2]) {
|
if (vecin[x2]) {
|
||||||
value += (toR - fromR) * vecin[x2];
|
value += ratio * vecin[x2];
|
||||||
}
|
}
|
||||||
++x2;
|
++x2;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue