在C++中是否有一個算法允許我在給定浮點值V(例如double或float)的情況下返回給定方向上的最接近的值(向上或向下) 正好小於或等於指定的小數位數D?如何將浮點值轉換爲可以精確表示特定小數位數的最近值?
例如,給定
T = double
V = 670000.08267799998
D = 6
對於方向朝= + INF我想的結果是670000.082678,和用於方向朝= -INF我想的結果是670000.082677
這有點類似於std :: nexttoward(),但有一個限制,即'下一個'值需要用最多D個小數位精確表示。我已經考慮過一個天真的解決方案,包括分離出小數部分,並用10^D縮放它,截斷它,然後再用10^-D縮放它,並將它重新粘到整數部分上,但是我不知道相信這可以保證結果值在底層類型中完全可以表達。
我希望有一種方法可以正確地做到這一點,但到目前爲止,我一直無法找到一個。
編輯:我覺得我原來的解釋沒有正確傳達我的要求。在@ patricia-shanahan的建議下,我會試着描述我的更高層次的目標,然後在這個背景下稍微改變一下這個問題。
在最高級別,我需要這個例程的原因是由於一些業務邏輯,其中我必須採用雙值K和百分比P,將其分成兩個雙分量V1和V2,其中V1〜P百分比的K和V1 + V2〜= K.捕獲的是,V1在通過有線協議發送給第三方之前用於進一步計算,該協議接受字符串格式的浮點值,最大值爲D小數位數。由於發送給第三方的值(以字符串格式)需要與使用V1進行計算的結果(雙格式)進行協調,因此我需要使用某個函數F()來「調整」V1,以使其爲儘可能接近K的P百分比,而仍然可以使用至多D小數位的字符串格式精確表示。 V2沒有V1的限制,可以計算爲V2 = K-F(V1)(可以理解並且可以接受的是,這可能導致V2使得V1 + V2非常接近但不完全等於K) 。
在較低的水平,我期待編寫程序來「調整」 V1的東西有以下特徵:
double F(double V, unsigned int D, bool roundUpIfTrueElseDown);
,其中輸出是通過取V和(如果必要的話計算,並且按bool param指定的方向)將其舍入到Dth小數位。
我的期望是,當V被序列化了如下
const auto maxD = std::numeric_limits<double>::digits10;
assert(D <= maxD); // D will be less than maxD... e.g. typically 1-6, definitely <= 13
std::cout << std::fixed
<< std::setprecision(maxD)
<< F(V, D, true);
然後輸出包含超過嗞小數位只有零。
重要的是要注意,出於性能原因,我正在尋找F()的實現,它不涉及在雙精度和字符串格式之間來回轉換。雖然輸出最終可能會轉換爲字符串格式,但在很多情況下,邏輯會在必要之前提前進行,我希望避免這種情況下的開銷。
在您的例子,這兩個結果通過0.000001,不同這不完全表示爲二進制浮點數,所以它們中的至少一個也不能完全表示。 – 2014-10-01 21:54:11
雖然0.000001不能完全表示爲雙精度,但我不確定這與我提出的問題有什麼關係。在這種情況下,我只關心輸出(例如670000.082677或670000.082678)是完全可以表示的;他們之間的差異並不需要用於我的目的。 – 2014-10-01 22:02:30
我的觀點是,至少有一個是*不可代表的。 – 2014-10-01 22:04:24