2009-12-28 2 views

ответ

7

Попробуйте функцию fmod.

+2

+1. Ответы на эффект «использования оператора модуля» упускают из виду, что модуль не является той же операцией, что и fmod. –

+0

Он принимает 18 символов, чтобы выразить в C#, что C++ может сказать в четыре раза. Это похоже на аллегорию. – Crashworks

+1

@Crashworks: Действительно. C# использует 18 символов, чтобы четко выражать намерение, в то время как C++ пробормотал, что звучит как проклятие. –

1

Несмотря на то, что ответ SLak отмечен как ответ, он неверен.

Да, оба вычисляют по модулю, но отличаются друг от друга тем, как обрабатываются знаки. (т. е. Джон Фэминелла прав). Реализации (и ссылки в к документации MSDN) можно найти здесь:

Is Math.IEEERemainder(x,y) equivalent to x%y?

Обратите внимание, что функция IEEERemainder() реализует по модулю в стандартной манере IEEE - вместо того, что K & R мысль о спине в начале 70-х.

2

В стандартной библиотеке C++ 11, std::remainder(x,y), теперь является эквивалентной функцией C# Math.IEEERemainder(x,y) в C++.

От: http://en.cppreference.com/w/cpp/numeric/math/remainder

Вычисляет IEEE остаток от операции деления с плавающей запятой x/y

Стандарт IEEE остаток x–(round(x/y)*y)

Принимая во внимание, fmod остаток x - trunc(x/y)*y, который может привести к различным ответам, например, поднятым в t его вопрос: Why am I getting a different result from std::fmod and std::remainder

Если вы действительно хотите получить IEEE определенный остаток, вам необходимо std::remainder(x,y) (или определить свою собственную функцию, если вы не можете использовать C++ 11)

Смежные вопросы