MOD: Difference between revisions

From QB64 Phoenix Edition Wiki
Jump to navigation Jump to search
(Created page with "The MOD operator gives the remainder after division of one number by another (sometimes called modulus). {{PageSyntax}} : {{Parameter|remainder}} = {{Parameter|numerator}} MOD {{Parameter|divisor}} {{Parameters}} * Returns the integer division remainder as a whole INTEGER, LONG or _INTEGER64 value. * {{Parameter|numerator}} is the INTEGER value to divide. * {{Parameter|divisor}} is the INTEGER value to divide by. {{PageDescription}} * F...")
 
No edit summary
 
(2 intermediate revisions by the same user not shown)
Line 6: Line 6:




{{Parameters}}
{{PageParameters}}
* Returns the integer division remainder as a whole [[INTEGER]], [[LONG]] or [[_INTEGER64]] value.
* Returns the integer division remainder as a whole [[INTEGER]], [[LONG]] or [[_INTEGER64]] value.
* {{Parameter|numerator}} is the [[INTEGER]] value to divide.  
* {{Parameter|numerator}} is the [[INTEGER]] value to divide.
* {{Parameter|divisor}} is the [[INTEGER]] value to divide by.
* {{Parameter|divisor}} is the [[INTEGER]] value to divide by.


Line 14: Line 14:
{{PageDescription}}
{{PageDescription}}
* Floating decimal point ''numerator'' and ''divisor'' values are [[CINT]] rounded (e.g. {{InlineCode}}19 MOD 6.7{{InlineCodeEnd}} returns 5 just like {{InlineCode}}19 MOD 7{{InlineCodeEnd}} would).
* Floating decimal point ''numerator'' and ''divisor'' values are [[CINT]] rounded (e.g. {{InlineCode}}19 MOD 6.7{{InlineCodeEnd}} returns 5 just like {{InlineCode}}19 MOD 7{{InlineCodeEnd}} would).
* MOD returns 0 if a number is evenly divisible by integer division ( [[\]] ) or the number divided is 0.
* MOD returns 0 if a number is evenly divisible by integer division ( [[\]] ) or the number divided is 0.
* '''{{Parameter|divisor}} (second value) must not be between 0 and .5'''. This will create a [[ERROR Codes|"Division by zero" error]] due to [[CINT]] rounding the value to 0.
* '''{{Parameter|divisor}} (second value) must not be between 0 and .5'''. This will create a [[ERROR Codes|"Division by zero" error]] due to [[CINT]] rounding the value to 0.
* The result has the same sign as the numerator (e.g. {{InlineCode}}-1 MOD 7{{InlineCodeEnd}} returns -1, not 6).
* The result has the same sign as the numerator (e.g. {{InlineCode}}-1 MOD 7{{InlineCodeEnd}} returns -1, not 6).
Line 21: Line 21:


{{PageExamples}}
{{PageExamples}}
''Example 1:''  
''Example 1:''
{{CodeStart}}
{{CodeStart}}
   I% = 100 {{Cl|\}} 9  
   I% = 100 {{Cl|\}} 9
   R% = 100 {{Cl|MOD}} 9
   R% = 100 {{Cl|MOD}} 9
   PRINT "Integer division ="; I%, "Remainder ="; R%  
   PRINT "Integer division ="; I%, "Remainder ="; R%
{{CodeEnd}}
{{CodeEnd}}
{{OutputStart}}
{{OutputStart}}
   Integer division = 11        Remainder = 1 '' ''
   Integer division = 11        Remainder = 1
{{OutputEnd}}
{{OutputEnd}}


Line 51: Line 51:
LOCATE 7, 20: PRINT USING tmp2$; numerator; divisor; numerator \ divisor
LOCATE 7, 20: PRINT USING tmp2$; numerator; divisor; numerator \ divisor
LOCATE 9, 20: PRINT USING tmp3$; numerator; divisor; numerator MOD divisor
LOCATE 9, 20: PRINT USING tmp3$; numerator; divisor; numerator MOD divisor
DO: SLEEP: LOOP UNTIL INKEY$ <> ""                            
DO: SLEEP: LOOP UNTIL INKEY$ <> ""
NEXT '' ''
NEXT
{{CodeEnd}}
{{CodeEnd}}




''Example 3:'' Integer division and MOD can be used to convert values to different base numbering systems from base 2 to 36 as [[STRING|strings]]:
''Example 3:'' Integer division and MOD can be used to convert values to different base numbering systems from base 2 to 36 as [[STRING|strings]]:
{{CodeStart}} '' ''
{{CodeStart}}
{{Cl|CLS}}
{{Cl|CLS}}
DO
DO
Line 89: Line 89:
{{Cl|LOOP}} {{Cl|UNTIL}} num& = 0
{{Cl|LOOP}} {{Cl|UNTIL}} num& = 0
BASEN$ = BN$
BASEN$ = BN$
{{Cl|END FUNCTION}} '' ''
{{Cl|END FUNCTION}}
{{CodeEnd}}
{{CodeEnd}}
: ''Note:'' Base numbering systems over base 10(0 - 9) use alphabetical letters to represent digits greater than 9 like [[&H|Hexadecimal]](0 - F).
: ''Note:'' Base numbering systems over base 10(0 - 9) use alphabetical letters to represent digits greater than 9 like [[&H|Hexadecimal]](0 - F).
Line 95: Line 95:


{{PageSeeAlso}}
{{PageSeeAlso}}
* [https://qb64phoenix.com/forum/showthread.php?tid=1196 Featured in our "Keyword of the Day" series]
* [[/|/ (normal division operator)]]
* [[/|/ (normal division operator)]]
* [[\|\ (integer division operator)]]
* [[\|\ (integer division operator)]]

Latest revision as of 17:27, 25 May 2024

The MOD operator gives the remainder after division of one number by another (sometimes called modulus).


Syntax

remainder = numerator MOD divisor


Parameters


Description

  • Floating decimal point numerator and divisor values are CINT rounded (e.g. 19 MOD 6.7 returns 5 just like 19 MOD 7 would).
  • MOD returns 0 if a number is evenly divisible by integer division ( \ ) or the number divided is 0.
  • divisor (second value) must not be between 0 and .5. This will create a "Division by zero" error due to CINT rounding the value to 0.
  • The result has the same sign as the numerator (e.g. -1 MOD 7 returns -1, not 6).
  • Division and multiplication operations are performed before addition and subtraction in QBasic's order of operations.


Examples

Example 1:

  I% = 100 \ 9
  R% = 100 MOD 9
  PRINT "Integer division ="; I%, "Remainder ="; R%
  Integer division = 11        Remainder = 1

Explanation: Integer division 100 \ 9 returns 11. 11 * 9 = 99. So the remainder must be 1 as 100 - 99 = 1. Normal decimal point division would return 11.11111.


Example 2: Comparing normal, integer and remainder division.

tmp1$ = " Normal:         ####.# / #### = ##.###   "
tmp2$ = " Integer:        ####.# \ #### = ###      "
tmp3$ = " Remainder:    ####.# MOD #### = ####     "
FOR i = 1 TO 6
   SELECT CASE i
     CASE 1: numerator = 1: divisor = 5
     CASE 2: numerator = 13: divisor = 10
     CASE 3: numerator = 990: divisor = 100
     CASE 4: numerator = 1100: divisor = 100
     CASE 5: numerator = 4501: divisor = 1000
     CASE 6: numerator = 50.6: divisor = 10
   END SELECT
LOCATE 5, 20: PRINT USING tmp1$; numerator; divisor; numerator / divisor
LOCATE 7, 20: PRINT USING tmp2$; numerator; divisor; numerator \ divisor
LOCATE 9, 20: PRINT USING tmp3$; numerator; divisor; numerator MOD divisor
DO: SLEEP: LOOP UNTIL INKEY$ <> ""
NEXT


Example 3: Integer division and MOD can be used to convert values to different base numbering systems from base 2 to 36 as strings:

CLS
DO
  INPUT "Enter a base number system 2 to 36: ", b%
  IF b% < 2 OR b% > 36 THEN EXIT DO
  PRINT "Enter a positive value to convert: ";
  num$ = ""
  DO: K$ = INKEY$
    num$ = num$ + K$
    LOCATE CSRLIN, POS(0): PRINT K$;
  LOOP UNTIL K$ = CHR$(13)
  n& = VAL(num$)
  IF n& = 0 THEN EXIT DO
  Bnum$ = BASEN$(n&, b%)
  PRINT Bnum$ ', VAL("&H" + Bnum$) 'tests hexadecimal base 16 only
LOOP

END

FUNCTION BASEN$ (number&, basenum%)
IF basenum% < 2 OR basenum% > 36 OR number& = 0 THEN EXIT FUNCTION
num& = number& 'protect value of number!
DO
  remain% = ABS(num&) MOD basenum% ' remainder is used to create actual digit 0 to Z
  num& = num& \ basenum% ' move up one exponent of base% with integer division
  IF remain% > 9 THEN
    b$ = CHR$(65 + (remain% - 10)) 'limited to base 36
  ELSE: b$ = LTRIM$(STR$(remain%)) ' make remainder a string number
  END IF
  BN$ = b$ + BN$ ' add remainder character to base number string
LOOP UNTIL num& = 0
BASEN$ = BN$
END FUNCTION
Note: Base numbering systems over base 10(0 - 9) use alphabetical letters to represent digits greater than 9 like Hexadecimal(0 - F).


See also



Navigation:
Main Page with Articles and Tutorials
Keyword Reference - Alphabetical
Keyword Reference - By usage
Report a broken link