nest-open-source / nest-learning-thermostat / 5.7.1 / u-boot / refs/heads/master / . / u-boot-imx / lib / ldiv.c

/* Copyright (C) 1992, 1997 Free Software Foundation, Inc. | |

This file is part of the GNU C Library. | |

* SPDX-License-Identifier: LGPL-2.0+ | |

*/ | |

typedef struct { | |

long quot; | |

long rem; | |

} ldiv_t; | |

/* Return the `ldiv_t' representation of NUMER over DENOM. */ | |

ldiv_t | |

ldiv (long int numer, long int denom) | |

{ | |

ldiv_t result; | |

result.quot = numer / denom; | |

result.rem = numer % denom; | |

/* The ANSI standard says that |QUOT| <= |NUMER / DENOM|, where | |

NUMER / DENOM is to be computed in infinite precision. In | |

other words, we should always truncate the quotient towards | |

zero, never -infinity. Machine division and remainer may | |

work either way when one or both of NUMER or DENOM is | |

negative. If only one is negative and QUOT has been | |

truncated towards -infinity, REM will have the same sign as | |

DENOM and the opposite sign of NUMER; if both are negative | |

and QUOT has been truncated towards -infinity, REM will be | |

positive (will have the opposite sign of NUMER). These are | |

considered `wrong'. If both are NUM and DENOM are positive, | |

RESULT will always be positive. This all boils down to: if | |

NUMER >= 0, but REM < 0, we got the wrong answer. In that | |

case, to get the right answer, add 1 to QUOT and subtract | |

DENOM from REM. */ | |

if (numer >= 0 && result.rem < 0) | |

{ | |

++result.quot; | |

result.rem -= denom; | |

} | |

return result; | |

} |