Функция floor
Функция выполняет округление значения val и возвращает наибольшее целое значение, которое не больше, чем val .
В Си, определён только один прототип данной функции, с типом данных double .
Параметры:
Возвращаемое значение
Наибольшее целое значение не большее, чем val .
Пример: исходный код программы
// пример использования функции floor #include // для оператора cout #include // для функции floor int main()
Пример работы программы
CppStudio.com
floor(2.3) = 2
floor(3.8) = 3
floor(-2.3) = -3
floor(-3.8) = -4
Дата: 07.09.2012
Поделиться:
Оставить комментарий
Вы должны войти, чтобы оставить комментарий.
Rust Journey: Хотите освоить язык программирования, который завоевывает мир?
Илон Маск, один из ведущих инноваторов нашего времени, утверждает, что за Rust будущее. А когда последний раз он ошибался в своих прогнозах?
✨ Не упустите свой шанс быть в авангарде IT-революции. Подписывайтесь на канал Rust Journey и начните свой путь в захватывающий мир Rust сегодня!
Floor c что это
Как-то я надеялся на оптимальность операций с плавающей точкой, оказалось — зря. Все надо проверять, буквально все.
Выражение для округления
int(floor(v + 0.5));
работает в 10 (!) раз медленнее, чем
int(v + ((v < 0.0) ? -0.5 : 0.5));
Я, конечно понимаю, что floor не должен ограничиваеться диапазоном int и вообще, эта операция несколько более сложная, чем отсечение дробной части. Но не в десять же раз!
Проверено на Intel P4 и Centrino, компиляторы VC 6 и 7.1.
Intel C++ 9.0 работает быстро в обоих случаях. Microsoft, убейся веником!
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re: floor/ceil - сюрприз
| От: | gear nuke |
| Дата: | 06.09.05 04:17 |
| Оценка: |
Здравствуйте, McSeem2, Вы писали:
MS>Выражение для округления
MS>
MS>int(floor(v + 0.5)); MS>
MS>работает в 10 (!) раз медленнее, чем
MS>
MS>int(v + ((v
MS>Я, конечно понимаю, что floor не должен ограничиваеться диапазоном int и вообще, эта операция несколько более сложная, чем отсечение дробной части. Но не в десять же раз!
MS>Проверено на Intel P4 и Centrino, компиляторы VC 6 и 7.1.
MS>Intel C++ 9.0 работает быстро в обоих случаях. Microsoft, убейся веником!
/QIfist поможет.
Иначе будет вызываться функция из либы.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[2]: floor/ceil - сюрприз
| От: | McSeem2 | http://www.antigrain.com |
| Дата: | 06.09.05 04:33 | |
| Оценка: |
Здравствуйте, gear nuke, Вы писали:
GN>/QIfist поможет.
GN>Иначе будет вызываться функция из либы.
Спасибо, конечно, но это категорически не катит. Я расчитываю на то, что правила преобразования double к int четко оговорены стандартом.
/QIfist should not be used if your code depends upon the expected behavior of truncating the fractional portion of the floating-point number. If you are unsure, do not use /QIfist.
Попробовал QIfist — действительно все кривеет сразу.
(unsigned char)(1.0 * 255.0 + 0.5) дает 0.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[3]: floor/ceil - сюрприз
| От: | gear nuke |
| Дата: | 06.09.05 04:39 |
| Оценка: |
Здравствуйте, McSeem2, Вы писали:
MS>Здравствуйте, gear nuke, Вы писали:
GN>>/QIfist поможет.
GN>>Иначе будет вызываться функция из либы.
MS>Спасибо, конечно, но это категорически не катит. Я расчитываю на то, что правила преобразования double к int четко оговорены стандартом.
MS>
MS>/QIfist should not be used if your code depends upon the expected behavior of truncating the fractional portion of the floating-point number. If you are unsure, do not use /QIfist.
MS>Попробовал QIfist — действительно все кривеет сразу.
MS>(unsigned char)(1.0 * 255.0 + 0.5) дает 0.
Есть такое. Режим округления _controlfp можно попробовать поменять.
А вообще, за то как реализована поддержка плавающей арифметики я бы руки поотрывал всё FPU на асме пишу из-за них.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[4]: floor/ceil - сюрприз
| От: | McSeem2 | http://www.antigrain.com |
| Дата: | 06.09.05 04:49 | |
| Оценка: |
Здравствуйте, gear nuke, Вы писали:
GN>Есть такое. Режим округления _controlfp можно попробовать поменять.
GN>А вообще, за то как реализована поддержка плавающей арифметики я бы руки поотрывал всё FPU на асме пишу из-за них.
Дело даже не в этом. У меня — библиотека в исходниках, платформо-независимая типа. Которая должна компилироваться и работать с опциями по умолчанию и в соответствии со спецификацией C++. Даже если я и сделаю, чтоб с /QIfist работало правильно, я не могу выставить требование компилировать именно с этой опцией. Потому что тогда по умолчанию все покривеет.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[5]: floor/ceil - сюрприз
| От: | gear nuke |
| Дата: | 06.09.05 05:40 |
| Оценка: |
Здравствуйте, McSeem2, Вы писали:
MS>У меня — библиотека в исходниках, платформо-независимая типа. Которая должна компилироваться и работать с опциями по умолчанию и в соответствии со спецификацией C++. Даже если я и сделаю, чтоб с /QIfist работало правильно,
Да уж. IMHO MS следовало бы predefined macros какой-нибудь объявлять когда эта опция включена, пусть с препроцессором, но можно было бы выкрутиться. Их похоже fpu не сильно волнует — сами фиксированную точку сплошь и рядом используют. Хуже всего, что в 8 beta2 всё так же осталось .
MS>я не могу выставить требование компилировать именно с этой опцией.
Либа небось для игрушек? Может не требование, а "если хотите на кривом компиляторе MSVC получить прирост скорости от 20% и выше, используйте /QIfist /DQIFIST". ну и #ifdef кучу .
MS>Потому что тогда по умолчанию все покривеет.
IC 8.1 изменяет fpu control word перед fistp когда включена опция /QIfist и округление соответствует стандарту. Он вообще одинаковый код производит что с ней, что без неё, поэтому и рулит. Может быть попробовать feature request в MS, в надежде что в релизе 8ки сделают по людски?
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re: floor/ceil - сюрприз
| От: | novik |
| Дата: | 06.09.05 08:14 |
| Оценка: |
Здравствуйте, McSeem2, Вы писали:
MS>Как-то я надеялся на оптимальность операций с плавающей точкой, оказалось — зря. Все надо проверять, буквально все.
MS>Выражение для округления
MS>
MS>int(floor(v + 0.5)); MS>
MS>работает в 10 (!) раз медленнее, чем
MS>
MS>int(v + ((v
MS>Я, конечно понимаю, что floor не должен ограничиваеться диапазоном int и вообще, эта операция несколько более сложная, чем отсечение дробной части. Но не в десять же раз!
MS>Проверено на Intel P4 и Centrino, компиляторы VC 6 и 7.1.
MS>Intel C++ 9.0 работает быстро в обоих случаях. Microsoft, убейся веником!
Простите за предыдущее отправленное письмо, я нажал не ту кнопочку. Тут виновник скорее не Microsoft, а Intel. Дело в том, что в своем компиляторе он скорее всего использует свою библиотеку IPP, которая на родных процессорах показывает чудеса производительности, а на других — так себе. Microsoft же, пытается абстрагироваться от типа процессора.
А то, что операции с плавающей точкой на порядок медленнее, вы не знали?
Re[2]: floor/ceil - сюрприз
| От: | gear nuke |
| Дата: | 06.09.05 14:03 |
| Оценка: |
Здравствуйте, novik, Вы писали:
N>Тут виновник скорее не Microsoft, а Intel. Дело в том, что в своем компиляторе он скорее всего использует свою библиотеку IPP, которая на родных процессорах показывает чудеса производительности, а на других — так себе. Microsoft же, пытается абстрагироваться от типа процессора.
N>А то, что операции с плавающей точкой на порядок медленнее, вы не знали?
Причина в другом. ICC использует подобный код, который инлайнится:
sub esp, 20 fld QWORD PTR _2il0floatpacket$3 mov DWORD PTR [esp], 1073741824 fadd DWORD PTR [esp] fnstcw [esp+8] movzx eax, WORD PTR [esp+8] and eax, -3073 or eax, 1024 mov DWORD PTR [esp+16], eax fldcw [esp+16] fistp DWORD PTR [esp+4] fldcw [esp+8] add esp, 20
И с опцией /QIfist, и без неё. Это даёт соответствие стандарту округления С++ в любом режиме. MSVC без /QIfist (стандартно) вызывает функцию из либы, что уже само по себе медленно, а с /QIfist тоже использует fistp, но в FPU control word не устанавливается нужный режим округления (предпологается, что это сделает сам программист). Можно бы говорить о баге MSVC, но поскольку это задокументировано, это фича .
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re: floor/ceil - сюрприз
| От: | Аноним | |
| Дата: | 06.09.05 15:53 | |
| Оценка: | -1 | |
Здравствуйте, McSeem2, Вы писали:
Виноваты здесь не Intel и не Microsoft, а только гребаный стандарт C/C++ который
не предусмотрел функции округления типа round()!
На I386 платформах есть инструкция fistp mem32 которая как раз сбрасывает значение
вещественного регистра st(0) в память с округлением к ближайшему.
inline int Round(double x) < int r; __asm < fld qword ptr [x] fistp dword ptr [r] >return r; >
Это конечно не выход для твоей либы, но хоть на скорость потестируй.
Re[2]: floor/ceil - сюрприз
| От: | gear nuke |
| Дата: | 06.09.05 16:05 |
| Оценка: |
Здравствуйте, <Аноним>, Вы писали:
А>На I386 платформах есть инструкция fistp mem32 которая как раз сбрасывает значение
А>вещественного регистра st(0) в память с округлением к ближайшему.
Аноним>
В общем случае это не верно. Эта функция округляет в соответствии с флагами FPU control word.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[2]: floor/ceil - сюрприз
| От: | McSeem2 | http://www.antigrain.com |
| Дата: | 06.09.05 16:09 | |
| Оценка: |
Здравствуйте, novik, Вы писали:
N>А то, что операции с плавающей точкой на порядок медленнее, вы не знали?
Для меня было сюрпризом, что конкретная функция floor() на порядок медленнее ее аналога, сделанного вручную. Учимся осознавать прочитанное.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[3]: floor/ceil - сюрприз
| От: | novik |
| Дата: | 06.09.05 17:06 |
| Оценка: |
Здравствуйте, McSeem2, Вы писали:
Для меня было сюрпризом, что конкретная функция floor() на порядок медленнее ее аналога, сделанного вручную. Учимся осознавать прочитанное.
Тип результата floor() кардинально отличается от fistp, так что, аналогия условная.
Продолжаем исследовать собственный код.
Re[4]: floor/ceil - сюрприз
| От: | gear nuke |
| Дата: | 06.09.05 17:14 |
| Оценка: |
Здравствуйте, novik, Вы писали:
N>Тип результата floor() кардинально отличается от fistp, так что, аналогия условная.
Он может отличаться. А может и не отличаться.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[4]: floor/ceil - сюрприз
| От: | McSeem2 | http://www.antigrain.com |
| Дата: | 06.09.05 17:21 | |
| Оценка: |
Здравствуйте, novik, Вы писали:
N>Тип результата floor() кардинально отличается от fistp, так что, аналогия условная.
N>Продолжаем исследовать собственный код.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[4]: floor/ceil - сюрприз
| От: | Alex Alexandrov | |
| Дата: | 06.09.05 20:11 | |
| Оценка: | 1 (1) | |
Здравствуйте, gear nuke, Вы писали:
MS>>Попробовал QIfist — действительно все кривеет сразу.
MS>>(unsigned char)(1.0 * 255.0 + 0.5) дает 0.
GN>Есть такое. Режим округления _controlfp можно попробовать поменять.
Если быть совсем точным, то
_controlfp(_MCW_RC, _RC_CHOP);
обеспечивает округление в ANSI C-режиме. Подробнее — тут: Re: вещественная арифметика and ftol
Автор: Alex Alexandrov
Дата: 08.03.05
It's kind of fun to do the impossible (Walt Disney)
Re[5]: floor/ceil - сюрприз
| От: | novik |
| Дата: | 07.09.05 06:40 |
| Оценка: |
Чтобы сделать floor собственными руками, в указанном примере нужно добавить преобразование в целое, а потом в вещественное число, обеспечить сишную декларацию вызова, еще, неплохо было бы, загнать эту функцию в lib, а потом сравнить c floor от Microsoft. Я думаю соотношение будет уже не таким чудовищным. А что будет если еще включить SSE2? А что, если проверить на Atlon'e?
Насколько я понимаю, оптимальный код обычно ориентируется на определенный тип процессора. И это, похоже, неизбежность.
Re[6]: floor/ceil - сюрприз
| От: | McSeem2 | http://www.antigrain.com |
| Дата: | 07.09.05 15:17 | |
| Оценка: |
Здравствуйте, novik, Вы писали:
MS>>Хорошо, исследуем. Выражения "v+0.5" и "v + ((v < 0.0) ? -0.5 : 0.5)" выполняются целиком и полностью с использованием плавающей точки. Тем не менее, они на порядок быстрее функции floor. N>Чтобы сделать floor собственными руками, в указанном примере нужно добавить преобразование в целое, а потом в вещественное число, обеспечить сишную декларацию вызова, еще, неплохо было бы, загнать эту функцию в lib, а потом сравнить c floor от Microsoft.
Именно так у меня и делается. Сначала приводится к int, а потом — опять в double (после вызова round). И работает на порядок быстрее, чем floor. Функция floor не такая простая, как кажется. Это мне достаточно диапазона int32, а вообще, она должна работать во всем диапазоне double. Но фишка в том (проверил), что вот такая оптимизация тоже ускоряет почти на порядок:
double round(double v) < if(v > -2147483647.0 && v < 2147483647.0) < return int(v + ((v < 0.0) ? -0.5 : 0.5)); >return floor(v + 0.5); >
Почему этой проверки нет в MS floor()? Маздайщики.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[6]: floor/ceil - сюрприз
| От: | gear nuke |
| Дата: | 08.09.05 00:22 |
| Оценка: |
Здравствуйте, novik, Вы писали:
N>Чтобы сделать floor собственными руками, в указанном примере нужно добавить преобразование в целое, а потом в вещественное число, обеспечить сишную декларацию вызова, еще, неплохо было бы, загнать эту функцию в lib, а потом сравнить c floor от Microsoft.
Это всё медленные решения. Судите сами: на Pentium IV call — 5 тактов, ret — 8; на Athlon call — 4, ret — 5. Эти команды не спариваются. И это ещё без учёта push. То есть, только на бесполезной работе будет тратиться порядка 20 тактов. А fist — 4 такта и спаривается.
N>Я думаю соотношение будет уже не таким чудовищным.
Да, будет быстрее, чем реализация от MS. Но лучше избавиться от вызовов:
int __forceinline Floor(double x) < __asm fld qword ptr x __asm fnstcw [esp-4] __asm movzx eax, word ptr[esp-4] __asm and eax, 0xf3ff __asm or eax, 0x0400 __asm mov dword ptr[esp-8], eax __asm fldcw [esp-8] __asm fistp dword ptr[esp-8] __asm fldcw [esp-4] __asm mov eax, [esp-8] > double __forceinline Floor(double x) < __asm fld qword ptr x __asm fnstcw [esp-4] __asm movzx eax, word ptr[esp-4] __asm and eax, 0xf3ff __asm or eax, 0x0400 __asm mov dword ptr[esp-8], eax __asm fldcw [esp-8] __asm frndint __asm fldcw [esp-4] >
N>А что будет если еще включить SSE2?
А поможет ли это при округлении одного числа?
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[7]: floor/ceil - сюрприз
| От: | McSeem2 | http://www.antigrain.com |
| Дата: | 08.09.05 03:15 | |
| Оценка: |
Здравствуйте, gear nuke, Вы писали:
GN>Это всё медленные решения. Судите сами: на Pentium IV call — 5 тактов, ret — 8; на Athlon call — 4, ret — 5. Эти команды не спариваются. И это ещё без учёта push. То есть, только на бесполезной работе будет тратиться порядка 20 тактов. А fist — 4 такта и спаривается.
У меня на P4-1.9, 10 миллионов floor() работало 3 секунды. То есть, примерно 570 тактов на штуку. Огромное время!
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[8]: floor/ceil - сюрприз
| От: | gear nuke |
| Дата: | 08.09.05 04:00 |
| Оценка: |
Здравствуйте, McSeem2,
GN>>Это всё медленные решения. Судите сами: на Pentium IV call — 5 тактов, ret — 8; на Athlon call — 4, ret — 5. Эти команды не спариваются. И это ещё без учёта push. То есть, только на бесполезной работе будет тратиться порядка 20 тактов. А fist — 4 такта и спаривается.
MS>У меня на P4-1.9, 10 миллионов floor() работало 3 секунды. То есть, примерно 570 тактов на штуку. Огромное время!
Так у MS ещё столько бесползной работы выполняется, что волосы на голове дыбом
Посмотрите на этот ужас (это даже не всё. )
text:00000004 public __floor_default .text:00000004 __floor_default proc near .text:00000004 .text:00000004 var_24 = qword ptr -24h .text:00000004 var_18 = qword ptr -18h .text:00000004 var_8 = qword ptr -8 .text:00000004 arg_0 = qword ptr 8 .text:00000004 .text:00000004 push ebp .text:00000005 mov ebp, esp .text:00000007 push ecx .text:00000008 push ecx .text:00000009 push ebx .text:0000000A push esi .text:0000000B mov esi, 0FFFFh .text:00000010 push esi .text:00000011 push _newcw .text:00000017 call __ctrlfp .text:0000001C fld [ebp+arg_0] .text:0000001F pop ecx .text:00000020 pop ecx .text:00000021 mov ebx, eax .text:00000023 mov eax, dword ptr [ebp+arg_0+6] .text:00000026 push ecx .text:00000027 and ax, 7FF0h .text:0000002B cmp ax, 7FF0h .text:0000002F push ecx .text:00000030 fstp [esp+18h+var_18] .text:00000033 jnz short loc_8A .text:00000035 call __sptype .text:0000003A test eax, eax .text:0000003C pop ecx .text:0000003D pop ecx .text:0000003E jle short loc_6D .text:00000040 cmp eax, 2 .text:00000043 jle short loc_5F .text:00000045 cmp eax, 3 .text:00000048 jnz short loc_6D .text:0000004A fld [ebp+arg_0] .text:0000004D push ebx .text:0000004E push ecx .text:0000004F push ecx .text:00000050 fstp qword ptr [esp] .text:00000053 push 0Bh .text:00000055 call __handle_qnan1 .text:0000005A add esp, 10h .text:0000005D jmp short loc_D1 .text:0000005F ; --------------------------------------------------------------------------- .text:0000005F .text:0000005F loc_5F: ; CODE XREF: __floor_default+3Fj .text:0000005F push esi .text:00000060 push ebx .text:00000061 call __ctrlfp .text:00000066 fld [ebp+arg_0] .text:00000069 pop ecx .text:0000006A pop ecx .text:0000006B jmp short loc_D1 .text:0000006D ; --------------------------------------------------------------------------- .text:0000006D .text:0000006D loc_6D: ; CODE XREF: __floor_default+3Aj .text:0000006D ; __floor_default+44j .text:0000006D fld [ebp+arg_0] .text:00000070 push ebx .text:00000071 fadd ds:__real@3ff0000000000000 .text:00000077 sub esp, 10h .text:0000007A fstp qword ptr [esp+8] .text:0000007E fld [ebp+arg_0] .text:00000081 fstp [esp+24h+var_24] .text:00000084 push 0Bh .text:00000086 push 8 .text:00000088 jmp short loc_C9 .text:0000008A ; --------------------------------------------------------------------------- .text:0000008A .text:0000008A loc_8A: ; CODE XREF: __floor_default+2Fj .text:0000008A call __frnd .text:0000008F fstp [ebp+var_8] .text:00000092 fld [ebp+arg_0] .text:00000095 pop ecx .text:00000096 fcomp [ebp+var_8] .text:00000099 pop ecx .text:0000009A fnstsw ax .text:0000009C test ah, 44h .text:0000009F jp short loc_AF .text:000000A1 .text:000000A1 loc_A1: ; CODE XREF: __floor_default+AEj .text:000000A1 push esi .text:000000A2 push ebx .text:000000A3 call __ctrlfp .text:000000A8 fld [ebp+var_8] .text:000000AB pop ecx .text:000000AC pop ecx .text:000000AD jmp short loc_D1 .text:000000AF ; --------------------------------------------------------------------------- .text:000000AF .text:000000AF loc_AF: ; CODE XREF: __floor_default+9Bj .text:000000AF test bl, 20h .text:000000B2 jnz short loc_A1 .text:000000B4 fld [ebp+var_8] .text:000000B7 push ebx .text:000000B8 sub esp, 10h .text:000000BB fstp qword ptr [esp+8] .text:000000BF fld [ebp+arg_0] .text:000000C2 fstp [esp+24h+var_24] .text:000000C5 push 0Bh .text:000000C7 push 10h .text:000000C9 .text:000000C9 loc_C9: ; CODE XREF: __floor_default+84j .text:000000C9 call __except1 .text:000000CE add esp, 1Ch .text:000000D1 .text:000000D1 loc_D1: ; CODE XREF: __floor_default+59j .text:000000D1 ; __floor_default+67j . .text:000000D1 pop esi .text:000000D2 pop ebx .text:000000D3 leave .text:000000D4 retn .text:000000D4 __floor_default endp
Мне в моих вариантах fldcw не нравится, а тут вообще не понять что .
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Math.floor()
Метод Math.floor() - округление вниз. Округляет аргумент до ближайшего меньшего целого.
Синтаксис
Math.floor(x)
Параметры
Описание
Поскольку метод floor() является статическим методом объекта Math , вы всегда должны использовать его как Math.floor() , а не пытаться вызывать метод на созданном экземпляре объекта Math (поскольку объект Math не является конструктором).
Примеры
Пример: использование метода Math.floor()
.floor(45.95); // 45 Math.floor(-45.95); // -46
Пример: корректировка округления десятичных дробей
// Замыкание (function () /** * Корректировка округления десятичных дробей. * * @param type Тип корректировки. * @param value Число. * @param exp Показатель степени (десятичный логарифм основания корректировки). * @returns Скорректированное значение. */ function decimalAdjust(type, value, exp) // Если степень не определена, либо равна нулю. if (typeof exp === "undefined" || +exp === 0) return Math[type](value); > value = +value; exp = +exp; // Если значение не является числом, либо степень не является целым числом. if (isNaN(value) || !(typeof exp === "number" && exp % 1 === 0)) return NaN; > // Сдвиг разрядов value = value.toString().split("e"); value = Math[type](+(value[0] + "e" + (value[1] ? +value[1] - exp : -exp))); // Обратный сдвиг value = value.toString().split("e"); return +(value[0] + "e" + (value[1] ? +value[1] + exp : exp)); > // Десятичное округление к ближайшему if (!Math.round10) Math.round10 = function (value, exp) return decimalAdjust("round", value, exp); >; > // Десятичное округление вниз if (!Math.floor10) Math.floor10 = function (value, exp) return decimalAdjust("floor", value, exp); >; > // Десятичное округление вверх if (!Math.ceil10) Math.ceil10 = function (value, exp) return decimalAdjust("ceil", value, exp); >; > >)(); // Округление к ближайшему Math.round10(55.55, -1); // 55.6 Math.round10(55.549, -1); // 55.5 Math.round10(55, 1); // 60 Math.round10(54.9, 1); // 50 Math.round10(-55.55, -1); // -55.5 Math.round10(-55.551, -1); // -55.6 Math.round10(-55, 1); // -50 Math.round10(-55.1, 1); // -60 // Округление вниз Math.floor10(55.59, -1); // 55.5 Math.floor10(59, 1); // 50 Math.floor10(-55.51, -1); // -55.6 Math.floor10(-51, 1); // -60 // Округление вверх Math.ceil10(55.51, -1); // 55.6 Math.ceil10(51, 1); // 60 Math.ceil10(-55.59, -1); // -55.5 Math.ceil10(-59, 1); // -50
Спецификации
| Specification |
|---|
| ECMAScript Language Specification # sec-math.floor |
Совместимость с браузерами
BCD tables only load in the browser
Смотрите также
- Math.abs()
- Math.ceil()
- Math.round()
- Math.sign() Экспериментальная возможность
- Math.trunc() Экспериментальная возможность
floor
Y = floor( X ) раунды каждый элемент X до ближайшего целого числа, меньше чем или равного тому элементу.
Y = floor( t ) раунды каждый элемент duration массив t к самому близкому номеру секунд, меньше чем или равных тому элементу.
Y = floor( t , unit ) раунды каждый элемент t к самому близкому количеству заданного модуля времени, меньше чем или равного тому элементу.
Примеры
Круглые элементы матрицы к отрицательной бесконечности
X = [-1.9 -0.2 3.4; 5.6 7.0 2.4+3.6i]; Y = floor(X)
Y = 2×3 complex -2.0000 + 0.0000i -1.0000 + 0.0000i 3.0000 + 0.0000i 5.0000 + 0.0000i 7.0000 + 0.0000i 2.0000 + 3.0000i
Круглые значения длительности к отрицательной бесконечности
Вокруг каждого значения в duration массив к самому близкому номеру секунд, меньше чем или равных тому значению.
t = hours(8) + minutes(29:31) + seconds(1.23); t.Format = 'hh:mm:ss.SS'
t = 1x3 duration 08:29:01.23 08:30:01.23 08:31:01.23
Y1 = floor(t)
Y1 = 1x3 duration 08:29:01.00 08:30:01.00 08:31:01.00
Вокруг каждого значения в t к самому близкому номеру часов, меньше чем или равных тому значению.
Y2 = floor(t,'hours')
Y2 = 1x3 duration 08:00:00.00 08:00:00.00 08:00:00.00
Входные параметры
X — Входной массив
скаляр | вектор | матрица | многомерный массив
Входной массив, заданный как скалярный, векторный, матричный или многомерный массив. Для комплексного X пол обрабатывает действительные и мнимые части независимо.
floor преобразует логический и char элементы X в double значения.
Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | char | logical
Поддержка комплексного числа: Да
t — Введите длительность
duration массив
Введите длительность в виде duration массив.
unit — Модуль времени
'seconds' (значение по умолчанию) | 'minutes' | 'hours' | 'days' | 'years'
Модуль времени в виде 'seconds' минуты часы дни , или 'years' . Длительность 1 года равна точно 365,2425 24-часовым дням.
Расширенные возможности
"Высокие" массивы
Осуществление вычислений с массивами, которые содержат больше строк, чем помещается в памяти.
Генерация кода C/C++
Генерация кода C и C++ с помощью MATLAB® Coder™.
Указания и ограничения по применению:
- Генерация кода не поддерживает char или logical типы данных для X .
Генерация кода графического процессора
Сгенерируйте код CUDA® для NVIDIA® графические процессоры с помощью GPU Coder™.
Указания и ограничения по применению:
- Генерация кода не поддерживает char или logical типы данных для X .
Основанная на потоке среда
Запустите код в фоновом режиме с помощью MATLAB® backgroundPool или ускорьте код с Parallel Computing Toolbox™ ThreadPool .
Эта функция полностью поддерживает основанные на потоке среды. Для получения дополнительной информации смотрите функции MATLAB Запуска в Основанной на потоке Среде.
Массивы графического процессора
Ускорьте код путем работы графического процессора (GPU) с помощью Parallel Computing Toolbox™.
Эта функция полностью поддерживает массивы графического процессора. Для получения дополнительной информации смотрите функции MATLAB Запуска на графическом процессоре (Parallel Computing Toolbox) .
Распределенные массивы
Большие массивы раздела через объединенную память о вашем кластере с помощью Parallel Computing Toolbox™.
Эта функция полностью поддерживает распределенные массивы. Для получения дополнительной информации смотрите функции MATLAB Запуска с Распределенными Массивами (Parallel Computing Toolbox) .
Смотрите также
Темы
- Целые числа
- Числа с плавающей запятой
Представлено до R2006a
Открытый пример
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
Документация MATLAB
Поддержка
- MATLAB Answers
- Помощь в установке
- Отчеты об ошибках
- Требования к продукту
- Загрузка программного обеспечения
© 1994-2021 The MathWorks, Inc.
- Условия использования
- Патенты
- Торговые марки
- Список благодарностей
Для просмотра документации необходимо авторизоваться на сайте
Войти
Памятка переводчика
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.