मैं एक ही मान काट-छांट की आवश्यकता होती है, जैसे कि एक 'सी' में i = (int)f
लिखता है।
आप SSE3 है, तो आप उपयोग कर सकते हैं:
int convert(float x)
{
int n;
__asm {
fld x
fisttp n // the extra 't' means truncate
}
return n;
}
वैकल्पिक रूप से, SSE2 के साथ (या 64 जहां इनलाइन विधानसभा उपलब्ध नहीं हो सकता में), आप लगभग के रूप में तेजी से उपयोग कर सकते हैं:
#include <xmmintrin.h>
int convert(float x)
{
return _mm_cvtt_ss2si(_mm_load_ss(&x)); // extra 't' means truncate
}
पुराने कंप्यूटरों पर राउंडिंग मोड को मैन्युअल रूप से सेट करने और सामान्य fistp
निर्देश का उपयोग करके रूपांतरण करने का विकल्प होता है।यह संभवतः केवल फ्लोट के सरणी के लिए काम करेगा, अन्यथा किसी भी संरचना का उपयोग न करने के लिए देखभाल की जानी चाहिए जो संकलक परिवर्तन गोल मोड (जैसे कास्टिंग) को बनाएगी। यह इस तरह से किया जाता है:
void Set_Trunc()
{
// cw is a 16-bit register [_ _ _ ic rc1 rc0 pc1 pc0 iem _ pm um om zm dm im]
__asm {
push ax // use stack to store the control word
fnstcw word ptr [esp]
fwait // needed to make sure the control word is there
mov ax, word ptr [esp] // or pop ax ...
or ax, 0xc00 // set both rc bits (alternately "or ah, 0xc")
mov word ptr [esp], ax // ... and push ax
fldcw word ptr [esp]
pop ax
}
}
void convertArray(int *dest, const float *src, int n)
{
Set_Trunc();
__asm {
mov eax, src
mov edx, dest
mov ecx, n // load loop variables
cmp ecx, 0
je bottom // handle zero-length arrays
top:
fld dword ptr [eax]
fistp dword ptr [edx]
loop top // decrement ecx, jump to top
bottom:
}
}
ध्यान दें कि इनलाइन विधानसभा केवल माइक्रोसॉफ्ट के दृश्य स्टूडियो compilers (और शायद बोर्लेन्ड) के साथ काम करता है, यह आदेश जीसीसी के साथ संकलित करने के जीएनयू विधानसभा के लिए लिखा जा करना होगा। इंट्रिनिक्स के साथ एसएसई 2 समाधान काफी पोर्टेबल होना चाहिए, हालांकि।
अन्य राउंडिंग मोड विभिन्न एसएसई 2 इंट्रिनिक्स द्वारा या मैन्युअल रूप से एफपीयू नियंत्रण शब्द को एक अलग राउंडिंग मोड में सेट करके संभव है।
एक पेंटियम 5 से चिप के लिए स्विच करें जो गणित सही है ... (मैन जो मुझे पुराना महसूस करता है ...) – JBB
मैं जमीन पर चारों ओर घूम रहा हूं। डांग - यह बहुत बुरे लोगों ने आपको इसके लिए नीचे संशोधित किया है! – Kevin
यह इसके लायक था। :) – JBB