{"record":{"id":"06db3fa84ee730ec","repo":"TheAlgorithms/Python","slug":"impossible-bulk-modulus","errorCode":null,"errorMessage":"Impossible bulk modulus","messagePattern":"Impossible bulk modulus","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"physics/speed_of_sound.py","lineNumber":40,"sourceCode":"\ndef speed_of_sound_in_a_fluid(density: float, bulk_modulus: float) -> float:\n    \"\"\"\n    Calculates the speed of sound in a fluid from its density and bulk modulus\n\n    Examples:\n    Example 1 --> Water 20°C: bulk_modulus= 2.15MPa, density=998kg/m³\n    Example 2 --> Mercury 20°C: bulk_modulus= 28.5MPa, density=13600kg/m³\n\n    >>> speed_of_sound_in_a_fluid(bulk_modulus=2.15e9, density=998)\n    1467.7563207952705\n    >>> speed_of_sound_in_a_fluid(bulk_modulus=28.5e9, density=13600)\n    1447.614670861731\n    \"\"\"\n\n    if density <= 0:\n        raise ValueError(\"Impossible fluid density\")\n    if bulk_modulus <= 0:\n        raise ValueError(\"Impossible bulk modulus\")\n\n    return (bulk_modulus / density) ** 0.5\n\n\nif __name__ == \"__main__\":\n    import doctest\n\n    doctest.testmod()\n","sourceCodeStart":22,"sourceCodeEnd":49,"githubUrl":"https://github.com/TheAlgorithms/Python/blob/f5988cc09713315817df6a7e327e258013a94440/physics/speed_of_sound.py#L22-L49","documentation":"Raised by physics/speed_of_sound.py:speed_of_sound_in_a_fluid when bulk_modulus <= 0 while density > 0. The bulk modulus measures a fluid's resistance to compression and is strictly positive for any physical medium; a non-positive value would make sqrt(bulk_modulus/density) zero or imaginary. This is the second guard, so you only see it once density has passed its check.","triggerScenarios":"Calling speed_of_sound_in_a_fluid(bulk_modulus=0, density=998), or with a negative bulk_modulus and any positive density, e.g. speed_of_sound_in_a_fluid(bulk_modulus=-2.15e9, density=998).","commonSituations":"Confusing MPa and Pa magnitudes (the docstring examples say 2.15MPa but the code expects 2.15e9 Pa); a missing config key defaulting to 0; sign error when converting a negative compressibility (k = -1/V * dV/dP is negative by convention) to bulk modulus (B = -V dP/dV is positive); using tabulated values for a substance at a state where no data exists.","solutions":["Pass bulk_modulus in pascals (Pa); water at 20C is 2.15e9, mercury 28.5e9 - the docstring's 'MPa' labels are misleading, the code expects Pa.","If your source gives compressibility k, convert with bulk_modulus = 1/abs(k) before calling.","Validate bulk_modulus > 0 together with density > 0 before the call.","Catch ValueError at the call site if zero bulk modulus is a legitimate 'no data' marker in your pipeline."],"exampleFix":"# before (docstring examples label units as MPa but pass Pa)\nspeed_of_sound_in_a_fluid(bulk_modulus=2.15, density=998)  # works but wrong physics\nspeed_of_sound_in_a_fluid(bulk_modulus=0, density=998)    # raises\n\n# after\nspeed_of_sound_in_a_fluid(bulk_modulus=2.15e9, density=998)","handlingStrategy":"validation","validationCode":"if bulk_modulus <= 0 or density <= 0:\n    raise ValueError('need density > 0 kg/m^3 and bulk_modulus > 0 Pa')\nc = speed_of_sound_in_a_fluid(bulk_modulus=bulk_modulus, density=density)","typeGuard":"def is_valid_bulk_modulus(b: float) -> bool:\n    return isinstance(b, (int, float)) and b > 0","tryCatchPattern":"try:\n    speed_of_sound_in_a_fluid(b, d)\nexcept ValueError as e:\n    if 'bulk modulus' in str(e):\n        ...","preventionTips":["Store bulk modulus in Pa, not MPa; 2.15e9 not 2.15.","Convert compressibility k to B = 1/abs(k).","Pair every bulk_modulus value with its unit in config/comments."],"tags":["physics","acoustics","units","validation","valueerror"],"backgroundTag":null,"analyzedSha":"f5988cc09713315817df6a7e327e258013a94440","analyzedAt":"2026-08-14T17:30:07.041Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}