| 875 | }; |
| 876 | |
| 877 | std::pair<float, float> divmod(float a, float b) { |
| 878 | if (b == 0.0f) { |
| 879 | float nan = std::numeric_limits<float>::quiet_NaN(); |
| 880 | return {nan, nan}; |
| 881 | } |
| 882 | float mod = std::fmod(a, b); |
| 883 | float div = (a - mod) / b; |
| 884 | if (mod != 0.0f) { |
| 885 | if ((b < 0.0f) != (mod < 0.0f)) { |
| 886 | mod += b; |
| 887 | div -= 1.0f; |
| 888 | } |
| 889 | } else { |
| 890 | mod = std::copysign(0.0f, b); |
| 891 | } |
| 892 | |
| 893 | float floordiv; |
| 894 | if (div != 0.0f) { |
| 895 | floordiv = std::floor(div); |
| 896 | if (div - floordiv > 0.5f) { |
| 897 | floordiv += 1.0f; |
| 898 | } |
| 899 | } else { |
| 900 | floordiv = std::copysign(0.0f, a / b); |
| 901 | } |
| 902 | return {floordiv, mod}; |
| 903 | } |
| 904 | |
| 905 | struct FloorDivide { |
| 906 | bfloat16 operator()(bfloat16 a, bfloat16 b) { |