рдХрд╣рди рдПрд▓реНрдЧреЛрд░рд┐рдердо: рдЙрддреНрдкрд╛рджреЛрдВ рдХрд╛ рд╕рдЯреАрдХ рдЕрдВрддрд░ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ

рдЫрд╡рд┐

рдореИрдВ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рднреМрддрд┐рдХ рд░реВрдк рд╕реЗ рдЖрдзрд╛рд░рд┐рдд рдкреНрд░рддрд┐рдкрд╛рджрди рдкреБрд╕реНрддрдХ рдХреЗ рдЕрдЧрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдХреБрдЫ рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЛ рдкрд░рд┐рд╖реНрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлреНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ рдПрд░рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдкрд░ рд▓реМрдЯ рдЖрдпрд╛ред рдлреНрд▓реЛрдЯрд┐рдВрдЧ-рдкреЙрдЗрдВрдЯ рд╕рдВрдЦреНрдпрд╛ рдЕрднрд┐рдХрд▓рди рдХрд╛ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдХреНрд╖реЗрддреНрд░ рд╣реИ, рдЬреЛ рдЖрд╢реНрдЪрд░реНрдп (рдЕрдЪреНрдЫрд╛ рдФрд░ рдмреБрд░рд╛) рд╕реЗ рднрд░рд╛ рд╣реБрдЖ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЕрдкреНрд░рд┐рдп рдЖрд╢реНрдЪрд░реНрдп рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрд╢реНрдХрд┐рд▓ рдЯреНрд░рд┐рдХреНрд╕ рднреА рд╣реИрдВред

рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдореИрдВ StackOverflow рдкрд░ рдЗрд╕ рдкреЛрд╕реНрдЯ рдкрд░ рдЖрдпрд╛, рдЬрд┐рд╕рд╕реЗ рдореИрдВрдиреЗ рд╕рдЯреАрдХ рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реАрдЦрд╛ a bbтИТc ddред

рд▓реЗрдХрд┐рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдЗрддрдиреА рдЪрд╛рд▓рд╛рдХ рдХреНрдпрд╛ рд╣реИ a bbтИТc dd? рд▓реЗрдирд╛ a=33962.035ред b=тИТ30438.8ред c=41563.4рдФрд░ d=тИТ24871.969ред (рдпреЗ рдЕрд╕рд▓реА рдореВрд▓реНрдп рд╣реИрдВ рдЬреЛ рдореБрдЭреЗ pbrt рдХреЗ рд▓реЙрдиреНрдЪ рдХреЗ рджреМрд░рд╛рди рдорд┐рд▓реЗ рдереЗ ред) 32-рдмрд┐рдЯ рдлреНрд▓реЛрдЯ рд╡реИрд▓реНрдпреВ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдпрд╣ рдорд┐рд▓рддрд╛ рд╣реИ: a рдмрд╛рд░b=тИТ1.03376365 рдЧреБрдирд╛109рдФрд░ c рдЯрд╛рдЗрдореНрд╕d=тИТ1.03376352 10рдмрд╛рд░9ред рд╣рдо рдШрдЯрд╛рд╡ рдХреЛ рдкреВрд░рд╛ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╣рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ тИТ128ред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рджреЛрд╣рд░реА рд╕рдЯреАрдХрддрд╛ рдХреЗ рд╕рд╛рде рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЕрдВрдд рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдлреНрд▓реЛрдЯ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ тИТ75.1656ред рдХреНрдпрд╛ рд╣реБрдЖ?

рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдп рдХрд╛ рдореВрд▓реНрдп рдиреАрдЪреЗ рдХреА рд░реЗрдЦрд╛ рд╕реЗ рдмрд╣реБрдд рдЖрдЧреЗ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ тИТ1 109, рдЬрд╣рд╛рдВ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдпреЛрдЧреНрдп рдЕрд╕реНрдерд╛рдпреА рдмрд┐рдВрджреБ рдорд╛рдиреЛрдВ рдХреЗ рдмреАрдЪ рдХреА рджреВрд░реА рдмрд╣реБрдд рдмрдбрд╝реА рд╣реИ - 64. рдЬрдм рдЧреЛрд▓рд╛рдИ рд╣реИ a bрдФрд░ c dрд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдирд┐рдХрдЯрддрдо рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдпреЛрдЧреНрдп рдлреНрд▓реЛрдЯ рдореЗрдВ, рд╡реЗ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддреЗ рд╣реИрдВ рдЬреЛ 64 рдХреЗ рдЧреБрдгрдХ рд╣реИрдВред рдмрджрд▓реЗ рдореЗрдВ, рдЙрдирдХрд╛ рдЕрдВрддрд░ 64 рдХрд╛ рдЧреБрдгрдХ рд╣реЛрдЧрд╛, рдФрд░ рдХреЛрдИ рдЙрдореНрдореАрдж рдирд╣реАрдВ рд╣реЛрдЧреА рдХрд┐ рдпрд╣ рдмрди рдЬрд╛рдПрдЧрд╛ тИТ75.1656рд╕реЗ рдЕрдзрд┐рдХ рдирд┐рдХрдЯ тИТ64ред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдкрд░рд┐рдгрд╛рдо рдФрд░ рднреА рдЕрдзрд┐рдХ рдерд╛ рдХрд┐ рджреЛрдиреЛрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреИрд╕реЗ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ тИТ1 109ред рд╣рдо рд╕реАрдзреЗ рдЕрдЪреНрдЫреЗ рдкреБрд░рд╛рдиреЗ рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рдХрдореА 1 рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░реЗрдВрдЧреЗред

рдпрд╣рд╛рдБ 2 рд╕реЗ рдмреЗрд╣рддрд░ рд╕рдорд╛рдзрд╛рди рд╣реИ:

inline float DifferenceOfProducts(float a, float b, float c, float d) { float cd = c * d; float err = std::fma(-c, d, cd); float dop = std::fma(a, b, -cd); return dop + err; } 

DifferenceOfProducts() рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ a bbтИТc ddрдПрдХ рддрд░рд╣ рд╕реЗ рдЬреЛ рднрдпрд╛рд╡рд╣ рд╕рдВрдХреБрдЪрди рд╕реЗ рдмрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рддрдХрдиреАрдХ рдХрд╛ рд╡рд░реНрдгрди рдкрд╣рд▓реА рдмрд╛рд░ рдкреНрд░рд╕рд┐рджреНрдз рд╡рд┐рд▓рд┐рдпрдо рдХрд╣рди рдиреЗ рд▓реЗрдЦ рдСрди рдж рдХреЙрд╕реНрдЯ рдСрдл рдлреНрд▓реЛрдЯрд┐рдВрдЧ-рдкреЙрдЗрдВрдЯрдХрдВрдкреНрдпреВрдЯреЗрд╢рди рд╡рд┐рджрд╛рдЙрдЯ рдПрдХреНрд╕рдЯреНрд░рд╛-рдкреНрд░реАрд╕реАрдЬрд╝ рдЕрд░рд┐рдердореЗрдЯрд┐рдХ рдореЗрдВ рдХрд┐рдпрд╛ рдерд╛ ред рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдХрд╣рди рдХрд╛ рдХрд╛рдо рд╕рдордЧреНрд░ рд░реВрдк рд╕реЗ рдкрдврд╝рдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рдЙрдирдХреЗ рдкрд╛рд╕ рдлреНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯреНрд╕ рдХреА рджреБрдирд┐рдпрд╛ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдЧрдгрд┐рддреАрдп рдФрд░ рддрдХрдиреАрдХреА рд╡рд┐рдЪрд╛рд░реЛрдВ рдкрд░ рдХрдИ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рд╣реИрдВред рдпрд╣рд╛рдБ рдЙрдирдХреЗ рдирд┐рд╖реНрдХрд░реНрд╖реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ:

рд╣рдо рдореЗрдВ рд╕реЗ рдЬреЛ рд▓реЛрдЧ рдлреНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ рдЕрдВрдХрдЧрдгрд┐рдд рдФрд░ рдЦрд░рд╛рдм рд╡рд┐рдЪрд╛рд░ рдХреЗ рд╕рдВрдХрд▓рди рдХреЗ "рдЕрдиреБрдХреВрд▓рди" рдХреЗ рд╡рд┐рдХреЗрдВрджреНрд░реАрдХрд░рдг рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рдХрд░ рдЪреБрдХреЗ рд╣реИрдВ, рд╡реЗ рдЗрд╕ рд▓рдбрд╝рд╛рдИ рдореЗрдВ рдЬреАрдд рдкрд░ рдЧрд░реНрд╡ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рднрд╡рд┐рд╖реНрдп рдХреА рдкреАрдврд╝рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд▓рдбрд╝рд╛рдИ рдХреЛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕рднреНрдпрддрд╛ рдХреЗ рдкреВрд░реЗ рд╕рд╛рд░ рдХрд╛ рдЦрдВрдбрди рдХрд░реЗрдЧрд╛ред рд╣рдорд╛рд░рд╛ рдЕрдиреБрднрд╡ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдФрд░ рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдгрд╛рд▓реА рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЕрд░рд╛рдЬрдХрддрд╛ рдХреЗ рд╕реНрд░реЛрдд рд╣реИрдВ рдЬрд┐рдирд╕реЗ рд╣рдореЗрдВ рдирд┐рдкрдЯрдирд╛ рд╣реИред рдмрд╣реБрдд рд╕реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рджреВрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдХреБрдЫ рдЖрдХрд░реНрд╖рдХ "рдЕрдиреБрдХреВрд▓рди" рдЬреЛ рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рдлреНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ рдирдВрдмрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдШрд╛рддрдХ рд╕рд╛рдмрд┐рдд рд╣реЛрддреЗ рд╣реИрдВред

рдЙрдирдХреА рдмреБрджреНрдзрд┐ рдХреЛ рд╢реНрд░рджреНрдзрд╛рдВрдЬрд▓рд┐ рджреЗрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдбрд┐рдлрд░реЗрдВрд╕рдСрдл DifferenceOfProducts() рд▓реМрдЯрддреЗ рд╣реИрдВ: рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреА рдорд╣рд╛рд░рдд рдХрд╛ рдЖрдзрд╛рд░ рдлреНрдпреВрдЬреНрдб рдорд▓реНрдЯреА-рдРрдб, рдПрдлрдПрдордП 3 рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реИред рдЧрдгрд┐рддреАрдп рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, FMA(a,b,c) рд╣реИ a+рдмрд╛рд░b+cрдЗрд╕рд▓рд┐рдП, рдкрд╣рд▓реА рдмрд╛рд░ рдореЗрдВ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдСрдкрд░реЗрд╢рди рдХреЗрд╡рд▓ рдорд╛рдЗрдХреНрд░реЛрдкреЙрдЯрд┐рдорд╛рдЗрдЬреЗрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реИ: рджреЛ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдирд┐рд░реНрджреЗрд╢ред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдПрдл.рдПрдо.
рдЗрд╕рдХреА рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕рдВрдкрддреНрддрд┐ рд╣реИ - рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдмрдВрдж рд╣реЛ рдЬрд╛рддреА рд╣реИред

рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ a+рдмрд╛рд░b+cрдкрд╣рд▓реЗ рдЧрдгрдирд╛ рдХреА a b, рдФрд░ рдлрд┐рд░ рдпрд╣ рдорд╛рди, рдЬрд┐рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдлреНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреЛ рдирд┐рдХрдЯрддрдо рдлреНрд▓реЛрдЯ рдХреЗ рд▓рд┐рдП рдЧреЛрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдлрд┐рд░ рдЗрд╕ рдЧреЛрд▓ рдореВрд▓реНрдп рдореЗрдВ рдЬреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рд╕реА, рдФрд░ рдпрд╣ рдкрд░рд┐рдгрд╛рдо рдлрд┐рд░ рд╕реЗ рдирд┐рдХрдЯрддрдо рдлреНрд▓реЛрдЯ рдХреЗ рд▓рд┐рдП рдЧреЛрд▓ рд╣реИред рдПрдлрдПрдордП рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ рдЕрдВрдд рдореЗрдВ рдЧреЛрд▓рд╛рдИ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдПрдХ рдордзреНрдпрд╡рд░реНрддреА рдореВрд▓реНрдп a bрдкрд░реНрдпрд╛рдкреНрдд рд╕рдЯреАрдХрддрд╛ рдмрдирд╛рдП рд░рдЦрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж рд╕реАрддреИрдпрд╛рд░ рдкрд░рд┐рдгрд╛рдо рд╕рд╣реА рдореВрд▓реНрдп рдХреЗ рд╕рдмрд╕реЗ рдХрд░реАрдм рд╣реЛрдЧрд╛ a+рдмрд╛рд░b+cрддреИрд░рдиреЗ рдХрд╛ рдореВрд▓реНрдпред

рдПрдлрдПрдордП рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдбрд┐рдлрд░реЗрдВрд╕рдСрдл рдкреНрд░реЙрдбрдХреНрдЯреНрд╕ DifferenceOfProducts() рд▓реМрдЯ рдЖрдПрдВрдЧреЗред рдлрд┐рд░, рдореИрдВ рдЗрд╕рдХреА рдкрд╣рд▓реА рджреЛ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рджрд┐рдЦрд╛рдКрдВрдЧрд╛:

  float cd = c * d; float err = std::fma(-c, d, cd); 

рдкрд╣рд▓реЗ рдЧреЛрд▓ рдорд╛рди рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ c dрдФрд░ рджреВрд╕рд░рд╛ ... рдШрдЯрд╛рдирд╛ c dрдЙрдирдХреЗ рдХрд╛рдо рд╕реЗ? рдпрджрд┐ рдЖрдк рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдПрдлрдПрдордП рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдк рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ err рд╣рдореЗрд╢рд╛ рд╢реВрдиреНрдп рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдПрдлрдПрдордП рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рджреВрд╕рд░реА рдкрдВрдХреНрддрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЧрдгрдирд╛ рдореВрд▓реНрдп рдореЗрдВ рдЧреЛрд▓рд╛рдИ рддреНрд░реБрдЯрд┐ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдирд┐рдХрд╛рд▓рддреА рд╣реИ c dрдФрд░ рдЗрд╕реЗ err рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдЪрд╛рддрд╛ рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж, рдЖрдЙрдЯрдкреБрдЯ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ:

  float dop = std::fma(a, b, -cd); return dop + err; 

рджреВрд╕рд░рд╛ рдПрдлрдПрдордП рдПрдлрдПрдордП рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рдмрд╣реБрдд рдЕрдВрдд рдореЗрдВ рдЧреЛрд▓рд╛рдИ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░рддрд╛ рд╣реИред рдирддреАрдЬрддрди, рдпрд╣ рднрдпрд╛рд╡рд╣ рдХрдореА рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рд░реЛрдзреА рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдПрдХ рдЧреЛрд▓ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред c dред рджреВрд╕рд░реА рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдП рдЧрдП рддреНрд░реБрдЯрд┐ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реБрдП return рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ "рдкреИрдЪ" рдХрд░ рджреЗрддрд╛ рд╣реИред рдЬреАрдирдиреЗрд░реЙрдб рдПрдЯ рдЕрд▓ рдХреЗ рдПрдХ рд▓реЗрдЦ рдореЗрдВред рдпрд╣ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдкрд░рд┐рдгрд╛рдо 1.5 ulps (рдпреВрдирд┐рдЯ рд╕рдЯреАрдХ рдЙрдкрд╛рдпреЛрдВ) рддрдХ рд╕рдЪ рд╣реИ, рдЬреЛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ: FMA рдФрд░ рд╕рд░рд▓ рдлреНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ рдСрдкрд░реЗрд╢рди 0.5 ulps рддрдХ рд╕рдЯреАрдХ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд▓рдЧрднрдЧ рд╕рд╣реА рд╣реИред

рд╣рдо рдПрдХ рдирдП рд╣рдереМрдбрд╝рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ


рдЬрдм рдЖрдк DifferenceOfProducts() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреА рддрд▓рд╛рд╢ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧреА рд╕рд╛рдмрд┐рдд рд╣реЛрддрд╛ рд╣реИред рджреНрд╡рд┐рдШрд╛рдд рд╕рдореАрдХрд░рдг рдХреЗ рд╡рд┐рднреЗрджрдХ рдХреА рдЧрдгрдирд╛? рдХреЙрд▓ DifferenceOfProducts(b, b, 4 * a, c) 4 ред 2x2 рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рдирд┐рд░реНрдзрд╛рд░рдХ рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛? рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░реЗрдЧрд╛ред Pbrt рдХреЗ рдЕрдЧрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ , рдореБрдЭреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рд▓рдЧрднрдЧ 80 рдЙрдкрдпреЛрдЧ рдорд┐рд▓реЗред рдЙрди рд╕рднреА рдореЗрдВ рд╕реЗ, рд╡реЗрдХреНрдЯрд░ рдЙрддреНрдкрд╛рдж рдХрд╛ рдХрд╛рд░реНрдп рд╕рдмрд╕реЗ рдкреНрд░рд┐рдп рд╣реИред рдпрд╣ рд╣рдореЗрд╢рд╛ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдПрдХ рд╕реНрд░реЛрдд рд░рд╣рд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдХрд╛рд░рдг рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рдХреЛ рдКрдкрд░ рдЙрдард╛рдирд╛ рдкрдбрд╝рд╛ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рджреЛрдЧреБрдирд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рддрд╛рдХрд┐ рдЖрдкрддреНрддрд┐рдЬрдирдХ рдХрдЯреМрддреА рд╕реЗ рдмрдЪ рд╕рдХреЗрдВ:

 inline Vector3f Cross(const Vector3f &v1, const Vector3f &v2) { double v1x = v1.x, v1y = v1.y, v1z = v1.z; double v2x = v2.x, v2y = v2.y, v2z = v2.z; return Vector3f(v1y * v2z - v1z * v2y, v1z * v2x - v1x * v2z, v1x * v2y - v1y * v2x); } 

рдФрд░ рдЕрдм рд╣рдо рдлреНрд▓реЛрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ DifferenceOfProducts() рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

 inline Vector3f Cross(const Vector3f &v1, const Vector3f &v2) { return Vector3f(DifferenceOfProducts(v1.y, v2.z, v1.z, v2.y), DifferenceOfProducts(v1.z, v2.x, v1.x, v2.z), DifferenceOfProducts(v1.x, v2.y, v1.y, v2.x)); } 

рдкреЛрд╕реНрдЯ рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рд╡рд╣ рдЪрд╛рд▓рд╛рдХ рдЙрджрд╛рд╣рд░рдг рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╡реЗрдХреНрдЯрд░ рдХрд╛рдо рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЪрд░рдг рдореЗрдВ, pbrt рдХреЛрдб рдХреЛ рд╡реИрдХреНрдЯрд░ рдХреЗ рд╡реЗрдХреНрдЯрд░ рдЙрддреНрдкрд╛рдж рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (33962.035,41563.4,7706.415)рдФрд░ (тИТ24871.969,тИТ30438.8,тИТ5643.727)ред рдЬрдм рдлреНрд▓реЛрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рддреЛ рд╣рдореЗрдВ рдПрдХ рд╡реЗрдХреНрдЯрд░ рдорд┐рд▓реЗрдЧрд╛ (1552,тИТ1248,тИТ128)ред (рд╕рд╛рдорд╛рдиреНрдп рдирд┐рдпрдо: рдпрджрд┐ рдлреНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ рдЧрдгрдирд╛рдУрдВ рдореЗрдВ рдЬрд╣рд╛рдВ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛рдПрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдмрд╣реБрдд рдмрдбрд╝реЗ рдкреВрд░реНрдгрд╛рдВрдХ рдорд╛рди рдирд╣реАрдВ рдорд┐рд▓рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд▓рдЧрднрдЧ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдХреЗрдд рд╣реИ рдХрд┐ рдПрдХ рднрдпрд╛рд╡рд╣ рдХрдореА рд╣реБрдИ рд╣реИред)

рджреЛрд╣рд░реА рдкрд░рд┐рд╢реБрджреНрдзрддрд╛ рдХреЗ рд╕рд╛рде, рд╡реЗрдХреНрдЯрд░ рдЙрддреНрдкрд╛рдж рд╣реИ (1556.0276,тИТ1257.5151,тИТ75.1656)ред рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдлреНрд▓реЛрдЯ рдХреЗ рд╕рд╛рде xрд╕рд╛рдорд╛рдиреНрдп рд▓рдЧ рд░рд╣рд╛ рд╣реИ рдпрдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рдмреБрд░рд╛ рд╣реИ zрдПрдХ рдЖрдкрджрд╛ рд╣реИ рдЬреЛ рдПрдХ рд╕рдорд╛рдзрд╛рди рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рдгрд╛ рдмрди рдЧрдИ рд╣реИред рдФрд░ рд╣рдо рдХреНрдпрд╛ DifferenceOfProducts() рд╕рд╛рде рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред рдЙрддреНрдкрд╛рдж DifferenceOfProducts() рдФрд░ рдлреНрд▓реЛрдЯ рдорд╛рди? (1556.0276,тИТ1257.5153,тИТ75.1656)ред рдЕрд░реНрде xрдФрд░ zрдбрдмрд▓ рдкрд░рд┐рд╢реБрджреНрдзрддрд╛ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИ, рдФрд░ рдпрдереЛрдбрд╝рд╛ рдСрдлрд╕реЗрдЯ - рдЗрд╕рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд ulp рд╕реЗ рдЖрдпрд╛ред

рдЧрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдбрд┐рдлрд░рдСрдлрдкреНрд░реЛрдбрдХреНрдЯреНрд╕ DifferenceOfProducts() рджреЛ рдПрдлрдПрдордП рдХрд░рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдЧреБрдгрд╛ рдФрд░ рдЬреЛрдбрд╝ рднреАред рдПрдХ рднреЛрд▓реЗ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдПрдХ рдПрдлрдПрдордП рдФрд░ рдПрдХ рдЧреБрдгрд╛ рдХреЗ рд╕рд╛рде рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ, рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рдЖрдзреЗ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рд╕реЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИ: рдореЗрд░реЗ рд▓реИрдкрдЯреЙрдк рдкрд░ рдЖрдпреЛрдЬрд┐рдд рд╕рд┐рдВрдереЗрдЯрд┐рдХ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдореЗрдВ, DifferenceOfProducts() рднреЛрд▓реА рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреЗрд╡рд▓ 1.09 рдЧреБрдирд╛ рдЕрдзрд┐рдХ рдорд╣рдВрдЧрд╛ рд╣реИред рдбрдмрд▓ рдкреНрд░рд┐рд╕рд┐рдЬрди рдСрдкрд░реЗрд╢рди 2.98 рдЧреБрдирд╛ рдзреАрдорд╛ рдерд╛ред

рдЬреИрд╕реЗ рд╣реА рдЖрдк рдПрдХ рднрдпрд╛рд╡рд╣ рдХрдореА рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реАрдЦрддреЗ рд╣реИрдВ, рдХреЛрдб рдореЗрдВ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рд░реНрджреЛрд╖ рджрд┐рдЦрдиреЗ рд╡рд╛рд▓реЗ рднрд╛рд╡ рд╕рдВрджрд┐рдЧреНрдз рд▓рдЧрдиреЗ рд▓рдЧрддреЗ рд╣реИрдВред DifferenceOfProducts() рдЙрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рдЗрд▓рд╛рдЬ рд▓рдЧрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИред

рдиреЛрдЯ


  1. рд╡рд┐рднрд┐рдиреНрди рд╕рдВрдХреЗрддреЛрдВ рдХреЗ рд╕рд╛рде рдорд╛рддреНрд░рд╛ рдШрдЯрд╛рдирд╛ рдпрд╛ рдПрдХ рд╣реА рд╕рдВрдХреЗрдд рдХреЗ рд╕рд╛рде рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдкрд░ рднрдпрд╛рд╡рд╣ рдХрдореА рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡рд┐рднрд┐рдиреНрди рд╕рдВрдХреЗрддреЛрдВ рдХреЗ рд╕рд╛рде рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдкрд░ рдпрд╣ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдмрди рд╕рдХрддреА рд╣реИред рдпрд╣реА рд╣реИ, рд░рд╛рд╢рд┐рдпреЛрдВ рдХреЛ рдорддрднреЗрдж рдХреЗ рд╕рдорд╛рди рд╕рдВрджреЗрд╣ рдХреЗ рд╕рд╛рде рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
  2. рдкрд╛рдардХ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрднреНрдпрд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ SumOfProducts() рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ, рдЬреЛ рднрдпрд╛рд╡рд╣ рд╕рдВрдХреБрдЪрди рд╕реЗ рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдХрд╛рд░реНрдп рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдмрддрд╛рдПрдВ рдХрд┐ dop + err == dop DifferenceOfProducts() , dop + err == dop рдореЗрдВ рдХреНрдпреЛрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрдХреЗрдд a*b рдФрд░ c*d рдЕрд▓рдЧ рд╣реИрдВред
  3. рдПрдлрдПрдордП рдирд┐рд░реНрджреЗрд╢ рдПрдХ рджрд╢рдХ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рддрдХ рдЬреАрдкреАрдпреВ рдкрд░ рдЙрдкрд▓рдмреНрдз рд░рд╣рд╛ рд╣реИ, рдФрд░ рдХрдо рд╕реЗ рдХрдо рдкрд╛рдВрдЪ рд╡рд░реНрд╖реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕реАрдкреАрдпреВ рдкрд░ред рд╕реАрдкреАрдпреВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╕реАрдзреЗ рдЙрдиреНрд╣реЗрдВ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрдкреАрдпреВ рдореЗрдВ рд╕рдВрдХрд▓рдХ рдЭрдВрдбреЗ рдЬреЛрдбрд╝рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ std::fma() ; gcc рдФрд░ -march=native , -march=native рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
  4. IEEE рдлрд╝реНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ рдлреЙрд░реНрдореЗрдЯ рдореЗрдВ, рджреЛ рдХреА рд╢рдХреНрддрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЧреБрдгрди рдареАрдХ-рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП 4 * a рдХрд┐рд╕реА рднреА рдЧреЛрд▓ рддреНрд░реБрдЯрд┐ рдХрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рдмрдирддрд╛ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

Source: https://habr.com/ru/post/hi475370/


All Articles